package me.tatarka.bindingcollectionadapter2; import android.databinding.BindingAdapter; import android.databinding.BindingConversion; import android.support.annotation.LayoutRes; import android.support.v4.view.ViewPager; import android.widget.Adapter; import android.widget.AdapterView; import android.widget.WrapperListAdapter; import java.util.List; /** * All the BindingAdapters so that you can set your adapters and items directly in your layout. */ public class BindingCollectionAdapters { // AdapterView @SuppressWarnings("unchecked") @BindingAdapter(value = {"itemBinding", "itemTypeCount", "items", "adapter", "itemDropDownLayout", "itemIds", "itemIsEnabled"}, requireAll = false) public static <T> void setAdapter(AdapterView adapterView, ItemBinding<T> itemBinding, Integer itemTypeCount, List items, BindingListViewAdapter<T> adapter, @LayoutRes int itemDropDownLayout, BindingListViewAdapter.ItemIds<? super T> itemIds, BindingListViewAdapter.ItemIsEnabled<? super T> itemIsEnabled) { if (itemBinding == null) { throw new IllegalArgumentException("onItemBind must not be null"); } BindingListViewAdapter<T> oldAdapter = (BindingListViewAdapter<T>) unwrapAdapter(adapterView.getAdapter()); if (adapter == null) { if (oldAdapter == null) { int count = itemTypeCount != null ? itemTypeCount : 1; adapter = new BindingListViewAdapter<>(count); } else { adapter = oldAdapter; } } adapter.setItemBinding(itemBinding); adapter.setDropDownItemLayout(itemDropDownLayout); adapter.setItems(items); adapter.setItemIds(itemIds); adapter.setItemIsEnabled(itemIsEnabled); if (oldAdapter != adapter) { adapterView.setAdapter(adapter); } } /** * Unwraps any {@link android.widget.WrapperListAdapter}, commonly {@link * android.widget.HeaderViewListAdapter}. */ private static Adapter unwrapAdapter(Adapter adapter) { return adapter instanceof WrapperListAdapter ? unwrapAdapter(((WrapperListAdapter) adapter).getWrappedAdapter()) : adapter; } // ViewPager @SuppressWarnings("unchecked") @BindingAdapter(value = {"itemBinding", "items", "adapter", "pageTitles"}, requireAll = false) public static <T> void setAdapter(ViewPager viewPager, ItemBinding<T> itemBinding, List items, BindingViewPagerAdapter<T> adapter, BindingViewPagerAdapter.PageTitles<T> pageTitles) { if (itemBinding == null) { throw new IllegalArgumentException("onItemBind must not be null"); } BindingViewPagerAdapter<T> oldAdapter = (BindingViewPagerAdapter<T>) viewPager.getAdapter(); if (adapter == null) { if (oldAdapter == null) { adapter = new BindingViewPagerAdapter<>(); } else { adapter = oldAdapter; } } adapter.setItemBinding(itemBinding); adapter.setItems(items); adapter.setPageTitles(pageTitles); if (oldAdapter != adapter) { viewPager.setAdapter(adapter); } } @BindingConversion public static <T> ItemBinding<T> toItemBinding(OnItemBind<T> onItemBind) { return ItemBinding.of(onItemBind); } }