RecyclerView,快乐的 VewHolder 模式
RecyclerView, happy VewHolder pattern
我对视图持有者模式有疑问。我有一个带有 View Holder 的回收视图,来自 Google 的人说最好的做法是像这样实现它:
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);
}
}
}
如果您查看 onBind 方法,它会调用 View Holder class 中的一个方法。这是根据 Google 中 RecyclerView 团队中某人的指示实施的。
我的问题是为什么这样更好。
这真的是一个偏好问题。它基本上将绑定 ViewHolder 数据的责任委托给了 ViewHolder 本身。
如果你有多个视图类型,有多个视图持有者类,那么你可以使用多态调用相同的方法来绑定数据,而不需要知道实际视图持有者的具体类型。
如果您甚至将 ViewHolder 作为它们自己的 类(而不是静态内部 类)移动,您的适配器将会小而漂亮。
我对视图持有者模式有疑问。我有一个带有 View Holder 的回收视图,来自 Google 的人说最好的做法是像这样实现它:
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);
}
}
}
如果您查看 onBind 方法,它会调用 View Holder class 中的一个方法。这是根据 Google 中 RecyclerView 团队中某人的指示实施的。 我的问题是为什么这样更好。
这真的是一个偏好问题。它基本上将绑定 ViewHolder 数据的责任委托给了 ViewHolder 本身。
如果你有多个视图类型,有多个视图持有者类,那么你可以使用多态调用相同的方法来绑定数据,而不需要知道实际视图持有者的具体类型。
如果您甚至将 ViewHolder 作为它们自己的 类(而不是静态内部 类)移动,您的适配器将会小而漂亮。