RecyclerView.ViewHolders中的Android DataBinding具有不同的布局
作者:互联网
我正在尝试在新项目中使用机器人数据绑定功能,并且到目前为止对此非常满意.
但现在我在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