Android 回收视图,快乐的维霍尔德模式

Android 回收视图,快乐的维霍尔德模式,android,android-recyclerview,android-viewholder,Android,Android Recyclerview,Android Viewholder,我有一个关于视图持有者模式的问题。我和视图持有者有一个recycler视图,谷歌的某个人说,最好的做法是这样实现它: public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<ListItem> listItems; private Context context; public MyAdapter(List<ListItem> list

我有一个关于视图持有者模式的问题。我和视图持有者有一个recycler视图,谷歌的某个人说,最好的做法是这样实现它:

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

private List<ListItem> listItems;
private Context context;

public MyAdapter(List<ListItem> listItems, Context context) {
    this.listItems = listItems;
    this.context = context;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.list_item, parent, false);
    final ViewHolder viewHolder = new ViewHolder(v);

    return viewHolder;
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    holder.bindTo(listItems.get(position), context);
}

@Override
public int getItemCount() {
    return listItems.size();
}

public static class ViewHolder extends RecyclerView.ViewHolder {

    private TextView txtHead;
    private TextView txtDesc;
    private ImageView imageView;

    public ViewHolder(View itemView) {
        super(itemView);

        txtHead = (TextView) itemView.findViewById(R.id.txtHead);
        txtDesc = (TextView) itemView.findViewById(R.id.txtDescription);
        imageView = (ImageView) itemView.findViewById(R.id.imageView);
    }

    public void bindTo(ListItem item, Context context){
        txtHead.setText(item.getHead());
        txtDesc.setText(item.getDesc());
        Picasso.with(context)
                .load(item.getImageUrl())
                .into(imageView);
    }
}
}
公共类MyAdapter扩展了RecyclerView.Adapter{ 私人物品清单; 私人语境; 公共MyAdapter(列表项、上下文){ this.listItems=listItems; this.context=上下文; } @凌驾 public ViewHolder onCreateViewHolder(视图组父级,int-viewType){ 视图v=LayoutInflater.from(parent.getContext()) .充气(R.layout.list_项,父项,假); 最终视窗夹持器视窗夹持器=新视窗夹持器(v); 返回视图持有者; } @凌驾 公共无效onBindViewHolder(ViewHolder,int位置){ holder.bindTo(listItems.get(position)、context); } @凌驾 public int getItemCount(){ 返回listItems.size(); } 公共静态类ViewHolder扩展了RecyclerView.ViewHolder{ 私有文本视图txtwead; 私有文本视图txtDesc; 私人影像视图; 公共视图持有者(视图项视图){ 超级(项目视图); txtHead=(TextView)itemView.findViewById(R.id.txtHead); txtDesc=(TextView)itemView.findViewById(R.id.txtDescription); imageView=(imageView)itemView.findViewById(R.id.imageView); } public void bindTo(列表项、上下文){ setText(item.getHead()); setText(item.getDesc()); 毕加索。与(上下文) .load(item.getImageUrl()) .进入(图像视图); } } } 如果查看onBind方法,它将调用视图持有者类中的方法。这是在谷歌的RecyclerView团队的指导下实现的。
我的问题是为什么这样更好。

这确实是一个偏好的问题。它基本上将绑定ViewHolder数据的责任委托给ViewHolder本身

如果有多个视图类型和多个视图持有者类,那么可以使用多态性调用相同的方法来绑定数据,而不需要知道实际视图持有者的具体类型


如果您甚至将viewholder作为自己的类(而不是静态内部类)移动,那么您的适配器将变得小巧漂亮。

视图holder模式对于更好的性能非常重要,但是在适配器或视图holder中拥有绑定代码只是组织代码的问题