前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Recyclerview中使用databinding完成多布局

Recyclerview中使用databinding完成多布局

作者头像
坑吭吭
发布2018-08-31 17:25:44
2.2K0
发布2018-08-31 17:25:44
举报

其实目前使用Recyclerview的关键部分在于adapter如何去编写,网上也有很多大神封装了各种万能adapter来供大家使用,但是对于我们这些新手,如果我们自己纯手撸一个adapter的话,可能会加深我们对于adapter的理解,下面就把我的撸法跟大家分享一下:

首先

新建一个adapter并继承RcyclerView.adapter:

代码语言:javascript
复制
class PoemListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> 

(注意这里的泛型直接传的是RcyclerView.ViewHolder接口,因为我们的item布局有多个,所以要准备多个Viewholder)

编写Viewholder

我们这里先假设有两种布局,并且布局全部是用databinding编写的,这里就不给出示例布局代码了,主要看viewholder:

代码语言:javascript
复制
class PoemListViewHolder extends RecyclerView.ViewHolder {
    private ItemPoemListBinding binding;

    public PoemListViewHolder(ItemPoemListBinding binding) {
        super(binding.getRoot());
        this.binding = binding;
    }

    public ItemPoemListBinding getBinding() {
        return binding;
    }

}

两个ViewHolder类似,基本上格式就是这样。里面写了一个getBinding的方法,方便获取binding对象。这里也把另一个ViewHolder贴上先:

代码语言:javascript
复制
class PoemListViewSelfHolder extends RecyclerView.ViewHolder {
    private ItemPoemListSelfBinding binding;

    public PoemListViewSelfHolder(ItemPoemListSelfBinding binding) {
        super(binding.getRoot());
        this.binding = binding;
    }

    public ItemPoemListSelfBinding getBinding() {
        return binding;
    }

}
重写getItemViewType(int position)方法

这里主要是区分定义item的样式,并返回样式的值,这里的返回值为int对象,为了直观,我在这里直接用0和1来表示两种布局:

代码语言:javascript
复制
    @Override
    public int getItemViewType(int position) {
        if (data.get(position).isSelf()) {
            return 0;
        } else {
            return 1;
        }
    }

这里面就是根据自己的业务逻辑来返回不同的代表布局的int值。

重写onCreateViewHolder(ViewGroup parent, int viewType)

这里根据返回的viewType布局类型来创建不同的ViewHolder,viewType为上个方法你自己返回的值:

代码语言:javascript
复制
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        switch (viewType) {
            case 0:
                ItemPoemListSelfBinding binding1 = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.item_poem_list_self, parent, false);
                return new PoemListViewSelfHolder(binding1);
            case 1:
                ItemPoemListBinding binding2 = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.item_poem_list, parent, false);
                return new PoemListViewHolder(binding2);

            default:
                ItemPoemListBinding binding3 = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()), R.layout.item_poem_list, null, false);
                return new PoemListViewHolder(binding3);
        }

    }
最关键的一步,重写onBindViewHolder(RecyclerView.ViewHolder holder,int position)方法

这一步来绑定数据,并且解决databinding在recyclerview中常见的闪烁问题:

代码语言:javascript
复制
    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
        if (holder instanceof PoemListViewHolder) {
            ((PoemListViewHolder) holder).getBinding().setHandler(handler);
            ((PoemListViewHolder) holder).getBinding().setData(data.get(position));
            ((PoemListViewHolder) holder).getBinding().executePendingBindings();
        } else {
            ((PoemListViewSelfHolder) holder).getBinding().setHandler(handler);
            ((PoemListViewSelfHolder) holder).getBinding().setData(data.get(position));
            ((PoemListViewSelfHolder) holder).getBinding().executePendingBindings();
        }
}

这种写法就是看你是不是特别想知道你用的到底是哪个ViewHolder了,如果只是单纯的绑定数据和显示数据,其实还有一种简单的写法:

代码语言:javascript
复制
    @Override
    public void onBindViewHolder(BindingHolder holder, int position) {
       holder.getBinding().setVariable(BR.item, data.get(position));
       holder.getBinding().executePendingBindings();
}

解决databinding闪烁问题的主要代码就是executePendingBindings();这个方法,他会在数据改变时立即刷新数据,变化的时间只有一帧,感兴趣的话可以搜一下这个方法。其实如果每次在改变数据前能定位到确切的某一个item的话,不加这句话也可以避免列表抖动,这里就不举例说明了。

收尾

最后别忘了把getItemCount()还有构造方法等写完整,就可以了。如果有更好的写法或者建议,欢迎大家在下面评论留言。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.03.10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 首先
  • 编写Viewholder
  • 重写getItemViewType(int position)方法
  • 重写onCreateViewHolder(ViewGroup parent, int viewType)
  • 最关键的一步,重写onBindViewHolder(RecyclerView.ViewHolder holder,int position)方法
  • 收尾
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档