gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:58:31 31 4
gpt4 key购买 nike

我正在尝试在新项目中使用 androids 数据绑定(bind)功能,到目前为止我对此非常满意。

但现在我在我的 recyclerviews viewholder 中遇到了一个问题。

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

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 种布局都具有相同的 View ,只是排列方式不同。所以模型到 View 的绑定(bind)是一样的。

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

  • ItemMediaHeaderBinding
  • ItemMediaDefaultBinding
  • ItemMediaSmallBinding

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

这个案例有最佳实践吗?是否有可能为这三个绑定(bind)类(如“ItemMediaBinding”)简单地创建一个父类(super class)。

提前致谢。

最佳答案

所以,我最后做的是创建一个 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 标签中的 layouts 中指定 Binding class names:

 <data class="PostTextBinding" />

但我不认为您可以在不同的布局中使用相同的类名。您可以在 GitHub 找到我的(示例)项目.

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

关于具有不同布局的 RecyclerView.ViewHolders 中的 Android DataBinding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38161724/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com