Data binding 入坑笔记四列表适配器用法
2017-11-24 本文已影响100人
LaxusJ
iceland
Data binding 入坑笔记一入门篇
Data binding 入坑笔记二进阶篇之双向绑定
Data binding 入坑笔记三layout表达式详解
这一篇咱们来讲讲如何在
RecyclerView
中的adapter
来使用Data binding,这个比较重要,因为毕竟各种样式的列表占据了app的半壁江山,我们一会儿先来说说原生怎么使用,然后再实战运用到一个比较火的开源项目BaseRecyclerViewAdapterHelper 上。
加载布局方式
在讲适配器之前我们先来说一下DataBindingUtil
加载布局的两种方式
普通加载
DataBindingUtil.setContentView(this, R.layout.activity_layout);
动态加载
View itemView = LayoutInflater.from(context)
.inflate(layoutId, viewGroup, false);
DataBindingUtil.bind(itemView);
或直接调用inflate方法加载布局
DataBindingUtil.inflate(LayoutInflater, layoutId,
parent, attachToParent);
我们加载列表时在adapter
中就用到了动态加载
原生使用方法
先来看ViewHolder
我们在构造中用DataBindingUtil
的bind
方法将view
绑定,然后提供一个bind
方法可以让每个item
绑定实体
public static class UserHolder extends RecyclerView.ViewHolder {
private UserItemBinding mBinding;
public UserHolder(View itemView) {
super(itemView);
mBinding = DataBindingUtil.bind(itemView);
}
public void bind(@NonNull User user) {
mBinding.setUser(user);
}
}
再来看adapter
的实现,我们现在onCreateViewHolder
中获取view
,然后在onBindViewHolder
中绑定数据,搞定
public class UserAdapter extends RecyclerView.Adapter<UserAdapter.UserHolder> {
@NonNull
private List<User> mUsers;
@Override
public UserHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View itemView = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.user_item, viewGroup, false);
return new UserHolder(itemView);
}
@Override
public void onBindViewHolder(UserHolder holder, int position) {
holder.bind(mUsers.get(position));
}
@Override
public int getItemCount() {
return mUsers.size();
}
}
在开源框架中用法
我们以BaseRecyclerViewAdapterHelper
为例,在不改底层框架的情况下我们可以这么用,当然如果嫌每次绑定很麻烦我们可以将开源库引进来改源码,把绑定动作放到底层去
public class DiscussAdapter extends BaseQuickAdapter<DiscussEntity, BaseViewHolder> {
FragmentDiscussItemBinding binding;
public DiscussAdapter() {
super(R.layout.fragment_discuss_item, null);
}
@Override
protected void convert(BaseViewHolder helper, DiscussEntity item) {
binding = DataBindingUtil.bind(helper.itemView);
binding.setDiscuss(item);
}
}