这个库提供了简单灵活的方式配置RecyclerView使用android数据绑定。
将库添加为gradle依赖关系
repositories {
jcenter() } dependencies { compile 'com.drextended.rvdatabinding:rvdatabinding:1.1.0' } // Don't forget to enable data binding dataBinding { enabled = true }
特征
-
.ListConfig
- 简单的构造器配置RecyclerView。 -
.BindableAdapter
- 简单的Recycler View适配器用于与数据绑定。 -
.BindingHolder
- 用于数据绑定的简单查看持有人。 -
.DividerItemDecoration
- RecyclerView的简单分隔装饰。 -
.ColorDividerItemDecoration
- 简单的彩色分隔线装饰RecyclerView。 -
.LoadMoreScrollListener
- 简单的RecyclerView ScrollListener实现延迟加载列表(无尽列表)。 -
.TwoWayLoadingScrollListener
- 简单的RecyclerView ScrollListener实现双向延迟加载列表(无尽列表)。 -
.BaseBindingAdapterDelegate
- 基本RecyclerView项目委托使用数据绑定。 -
.ModelItemDelegate
- 通用ActionDelegate。如果你不想实现自定义一个,你可以使用这一个。
用法
首先,你肯定应该有项目的pojo模型
public class User implements BaseModel {
public String name; public String avatar; } public class Location implements BaseModel { public String name; public String image; } public class Advertisement implements BaseModel { public String label; public String image; }
2.然后,您应该为每个项目和列表页面创建布局
fragment_page.xml
<layout ...>
<data> <variable name="viewModel" type="com.drextended.rvdbsample.viewmodel.ListViewModel"/> </data> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="match_parent" app:listConfig="@{viewModel.getListConfig()}"/> </layout>
item_user.xml
<layout xmlns:...>
<data> <import type="com.drextended.rvdbsample.model.ActionType"/> <variable name="user" type="com.drextended.rvdbsample.model.User"/> <variable name="actionHandler" type="com.drextended.actionhandler.listener.ActionClickListener"/> </data> <android.support.v7.widget.CardView ... app:actionHandler="@{actionHandler}" app:actionType="@{ActionType.OPEN}" app:actionTypeLongClick="@{ActionType.MENU}" app:model="@{user}"> <FrameLayout ...> <ImageView ... app:glideAnimation="@{R.anim.scale_in}" app:glideCacheStrategy='@{"RESULT"}' app:glidePath="@{user.avatar}" app:glidePlaceholder="@{@android:drawable/ic_menu_gallery}" app:glideTransform='@{"CIRCLE"}' tools:src="@android:drawable/ic_menu_gallery"/> <TextView ... android:text="@{user.name}"/> </FrameLayout> </android.support.v7.widget.CardView> </layout>
同为item_location.xml和item_advertisement.xml
3.然后如果您不想使用泛型,请为项目创建ItemDelegates
UserDelegate.java
public class UserDelegate extends ActionAdapterDelegate<BaseModel, ItemUserBinding> {
public UserDelegate(final ActionClickListener actionHandler) { super(actionHandler); } @Override public boolean isForViewType(@NonNull final List<BaseModel> items, final int position) { return items.get(position) instanceof User; } @NonNull @Override public BindingHolder<ItemUserBinding> onCreateViewHolder(final ViewGroup parent) { return BindingHolder.newInstance(R.layout.item_user, LayoutInflater.from(parent.getContext()), parent, false); } @Override public void onBindViewHolder(@NonNull final List<BaseModel> items, final int position, @NonNull final BindingHolder<ItemUserBinding> holder) { final User user = (User) items.get(position); holder.getBinding().setUser(user); holder.getBinding().setActionHandler(getActionHandler()); } @Override public long getItemId(final List<BaseModel> items, final int position) { return items.get(position).getId(); } }
4.在你的viewmodel中组装所有这些
AllInOneListViewModel.java
//使用的动作处理库处理中的项目点击/长按:https://github.com/drstranges/ActionHandler final ActionClickListener actionHandler = new ActionHandler.Builder()
//.addAction(null, new SimpleAnimationAction()) // Applied for any actionType //.addAction(null, new TrackAction()) // Applied for any actionType .addAction(ActionType.OPEN, new OpenProfileAction()) .addAction(ActionType.MENU, new CompositeAction<String>( (context, model) -> getTitle(model), new ActionItem(ActionType.MENU_ITEM_1, new OpenSecondActivity(), R.string.menu_item_1), new ActionItem(ActionType.MENU_ITEM_2, new ShowToastAction(), R.string.menu_item_2) )) .setActionInterceptor(this) .setActionFiredListener(this) .build(); // Build generic bindable adapter. Just list all used item delegates mAdapter = new BindableAdapter<>( new UserDelegate(actionHandler), // you can create custom delegate //new ModelActionItemDelegate<BaseModel>(actionHandler, User.class, R.layout.item_user, BR.user), // or use generic new ModelActionItemDelegate<BaseModel>(actionHandler, Location.class, R.layout.item_location, BR.location), new ModelActionItemDelegate<BaseModel>(actionHandler, Advertisement.class, R.layout.item_advertisment, BR.advertisment) ); // Config for RecyclerView mListConfig = new ListConfig.Builder(mAdapter) .setLayoutManagerProvider(new SimpleGridLayoutManagerProvider(mSpanCount, getSpanSizeLookup())) // if not set, LinearLayoutManager applied by default .addItemDecoration(new ColorDividerItemDecoration(color, spacing, SPACE_LEFT|SPACE_TOP, false)) //.setDefaultDividerEnabled(true) .addOnScrollListener(new OnLoadMoreScrollListener(mCallback)) .setItemAnimator(getCustomItemAnimator()) // .setHasFixedSize(true) .setItemTouchHelper(getItemTouchHelper()) .build(context); loadData();
二手图书馆:
- AdapterDelegates
- ActionHandler
启发:
https://github.com/sockeqwe/AdapterDelegates
http://hannesdorfmann.com/android/adapter-delegates
样品
示例apk文件
资源均来自第三方,谨慎下载,前往第三方网站下载