package me.tatarka.bindingcollectionadapter.sample; import android.databinding.ObservableArrayList; import android.databinding.ObservableList; import android.databinding.ViewDataBinding; import android.support.v7.widget.RecyclerView; import android.view.View; import me.tatarka.bindingcollectionadapter2.BindingListViewAdapter; import me.tatarka.bindingcollectionadapter2.BindingRecyclerViewAdapter; import me.tatarka.bindingcollectionadapter2.BindingViewPagerAdapter; import me.tatarka.bindingcollectionadapter2.ItemBinding; import me.tatarka.bindingcollectionadapter2.collections.MergeObservableList; import me.tatarka.bindingcollectionadapter2.itembindings.OnItemBindClass; import me.tatarka.bindingcollectionadapter.sample.BR; import me.tatarka.bindingcollectionadapter.sample.R; /** * Created by evan on 5/31/15. */ public class ViewModel { private final boolean checkable; public final ObservableList<ItemViewModel> items = new ObservableArrayList<>(); /** * Items merged with a header on top and footer on bottom. */ public final MergeObservableList<Object> headerFooterItems = new MergeObservableList<>() .insertItem("Header") .insertList(items) .insertItem("Footer"); /** * Custom adapter that logs calls. */ public final LoggingRecyclerViewAdapter<Object> adapter = new LoggingRecyclerViewAdapter<>(); public ViewModel(boolean checkable) { this.checkable = checkable; for (int i = 0; i < 3; i++) { items.add(new ItemViewModel(i, checkable)); } } /** * Binds a homogeneous list of items to a layout. */ public final ItemBinding<ItemViewModel> singleItem = ItemBinding.of(BR.item, R.layout.item); /** * Binds multiple items types to different layouts based on class. This could have also be * written manually as * <pre>{@code * public final OnItemBind<Object> multipleItems = new OnItemBind<Object>() { * @Override * public void onItemBind(ItemBinding itemBinding, int position, Object item) { * if (String.class.equals(item.getClass())) { * itemBinding.set(BR.item, R.layout.item_header_footer); * } else if (ItemViewModel.class.equals(item.getClass())) { * itemBinding.set(BR.item, R.layout.item); * } * } * }; * }</pre> */ public final OnItemBindClass<Object> multipleItems = new OnItemBindClass<>() .map(String.class, BR.item, R.layout.item_header_footer) .map(ItemViewModel.class, BR.item, R.layout.item); /** * Define stable item ids. These are just based on position because the items happen to not * every move around. */ public final BindingListViewAdapter.ItemIds<Object> itemIds = new BindingListViewAdapter.ItemIds<Object>() { @Override public long getItemId(int position, Object item) { return position; } }; /** * Define page titles for a ViewPager */ public final BindingViewPagerAdapter.PageTitles<ItemViewModel> pageTitles = new BindingViewPagerAdapter.PageTitles<ItemViewModel>() { @Override public CharSequence getPageTitle(int position, ItemViewModel item) { return "Item " + (item.getIndex() + 1); } }; /** * Custom view holders for RecyclerView */ public final BindingRecyclerViewAdapter.ViewHolderFactory viewHolder = new BindingRecyclerViewAdapter.ViewHolderFactory() { @Override public RecyclerView.ViewHolder createViewHolder(ViewDataBinding binding) { return new MyAwesomeViewHolder(binding.getRoot()); } }; private static class MyAwesomeViewHolder extends RecyclerView.ViewHolder { public MyAwesomeViewHolder(View itemView) { super(itemView); } } public void addItem() { items.add(new ItemViewModel(items.size(), checkable)); } public void removeItem() { if (items.size() > 1) { items.remove(items.size() - 1); } } }