Android 回收视图,快乐的维霍尔德模式
我有一个关于视图持有者模式的问题。我和视图持有者有一个recycler视图,谷歌的某个人说,最好的做法是这样实现它: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
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中拥有绑定代码只是组织代码的问题