Android DatabindAndroid开发Android开发经验谈

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我们在构造中用DataBindingUtilbind方法将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);
    }

}
上一篇下一篇

猜你喜欢

热点阅读