在ViewHolder中绑定

Nom*_*sta 12 android android-viewholder android-recyclerview

这将是理论问题.

作为每个人,我们在应用程序的许多部分使用RecyclerView.有时,RecyclerView包含不同的项目,不仅包括图像,还包括广告,提示等.这就是为什么我们可以在Adapter中使用getViewType()方法.

但是当我们有很多viewTypes并且在Adapter中绑定它不优雅时会出现问题.所以这就是问题,在ViewHolder中绑定数据是不错的好模式?

假设我们有应用列表.

每个应用程序都有简洁的名称.我们的ViewHolder看起来像这样:

class AppViewHolder extends RecyclerView.ViewHolder {

     public TextView nameText;

     AppViewHolder(View itemView) {
          super(itemView)
          nameText = (TextView) itemView.findViewById(R.id.text_name);
     }
}
Run Code Online (Sandbox Code Playgroud)

现在我们可以添加bind方法:

public void bind(App app) {
     nameText.setText(app.getName());
}
Run Code Online (Sandbox Code Playgroud)

这是好模式吗?

另一种解决方案是使用ViewModel.因为我们在RecyclerView中有不同的项目,所以我们的适配器可以包含类的列表,它是每个ViewModel的基类.

所以基础课是:

class RecyclerViewItem {}
Run Code Online (Sandbox Code Playgroud)

现在是ViewModel for App的类.

class AppRecyclerViewItem extends RecyclerViewItem {

     App app;

     ...
}
Run Code Online (Sandbox Code Playgroud)

和我们的适配器只有RecyclerViewItems列表:

class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    List<RecyclerViewItem> items;

    ...
}
Run Code Online (Sandbox Code Playgroud)

因此,使用这种方法(我的意思是使用ViewModel),最好在ViewHolder或ViewModel中添加bind方法吗?

R. *_*ski 8

我会说你的解决方案都不好.第一个仅适用于在适配器中只出现一次的项目.创建一个填充内部行的方法ViewHolder不是一个好的解决方案,因为不同类型的ViewHolders会增长,你RecyclerView.Adapter会获得越来越多的行.

第二种方法也不好.模型是模型,应该只包含数据而不是应用程序的业务逻辑.

我建议一个保持RecyclerView.Adapter清洁的解决方案,并传递创建ViewHolder和填充数据给代表的逻辑,这将在ie中注册.RecyclerView.Adapter构造函数.这里解释了这种技术

这样,即使通过多种不同的方式注册ViewHolder也不会特别添加样板RecyclerView.Adapter,但是将RecyclerView.Adapter行创建和填充的逻辑委托给那些代理.

但这只是一个建议.

  • 你在工作中使用这种方法吗?你能分享一下你的经历吗? (2认同)