ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

RecyclerView.ViewHolders中的Android DataBinding具有不同的布局

2019-06-23 07:10:37  阅读:177  来源: 互联网

标签:android android-databinding android-viewholder


我正在尝试在新项目中使用机器人数据绑定功能,并且到目前为止对此非常满意.

但现在我在recyclerviews视图中遇到了一个问题.

我的视图使用不同的布局(基于创建时的视图类型)

public MediaViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
     switch(viewType){
          case HEADER: 
             int layout = R.layout.item_media_header;
             break;
          case DEFAULT: 
             int layout = R.layout.item_media_default;
             break;
          case SMALL: 
             int layout = R.layout.item_media_small;
             break;
     }
     View v = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false);
     return new MediaViewHolder(v);
}

所以这3个布局中的所有布局都有相同的视图,只是以不同的方式排列.因此,模型与视图的绑定是相同的.

无论如何,基于android创建的那些布局

> ItemMediaHeaderBinding
> ItemMediaDefaultBinding
> ItemMediaSmallBinding

这很糟糕,因为它会强制我创建3个不同的ViewHolder类或通过检查使用哪个布局来实例化正确的绑定类.

这种情况有最好的做法吗?是否有可能只为这三个绑定类创建一个超类,如“ItemMediaBinding”.

提前致谢.

解决方法:

所以,我最终做的是创建一个BaseViewHolder.class,创建扩展这个BaseViewHolder的其他ViewHolder类,这样我的RecyclerView.Adapter看起来仍然很干净,因为我最终得到了类似这样的东西作为ViewHolder:

public class BaseVH extends RecyclerView.ViewHolder {
    private ViewDataBinding mBinding;

    public BaseVH(ViewDataBinding mBinding) {
        super(mBinding.getRoot());
        this.mBinding = mBinding;
    }

    public void displayPost(final NewsItem post) {
        PostItemViewModel vm = new PostItemViewModel();
        vm.getPost().set(post);
        mBinding.setVariable(BR.viewModel, vm);
    }
}

public class TextPostVH extends BaseVH {
    private final PostTextBinding mBinding;

    public TextPostVH(final PostTextBinding binding) {
        super(binding);
        mBinding = binding;
    }

    //Have a method like this in the BaseVH.class
    @Override
    public void displayPost(final NewsItem post) {
        if (mBinding.getViewModel() == null) {
            mBinding.setViewModel(new PostItemViewModel());
        }
        mBinding.getViewModel().getPost().set(post);
    }
}

所以你可以简单地调用onBindViewHolder:

@Override
public void onBindViewHolder(final BaseVH holder, final int position) {
    //only a ViewHolder containing ads has to be filtered, the others work with displayPost()
    if (holder instanceof AdVH){
        holder.displayPost(mPosts.get(position));
        ((AdVH) holder).displayAd();
    } else {
        holder.displayPost(mPosts.get(position));
    }
}

您可以在data-tag中的布局中指定Binding类名称:

 <data class="PostTextBinding" />

但我不认为你可以在不同的布局中使用相同的类名.你可以在GitHub找到我的(样本)项目.

另一个解决方案是here on Github解释的.他们已经创建了一个(真正的)通用的RecyclerView.Adapter,但我发现这个……对我来说有点太多了.

标签:android,android-databinding,android-viewholder
来源: https://codeday.me/bug/20190623/1268460.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有