在RecycleView适配器中实现多个ViewHolder类型

CoX*_*ier 9 android android-layout android-view android-viewholder android-recyclerview

这可能是一个讨论而不是一个问题.

正常的方式来实现多种类型

如您所知,如果我们想要实现多种类型RecyclerView,我们应该提供多种CustomViewHolder扩展RecyclerView.ViewHolder.

对于exmpale,

class TextViewHolder extends RecyclerView.ViewHolder{
    TextView textView;
}

class ImageViewHolder extends RecyclerView.ViewHolder{
    ImageView imageView;
}
Run Code Online (Sandbox Code Playgroud)

然后我们必须覆盖getItemViewType.并onCreateViewHolder进入构造TextViewHolderImageViewHolder.

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == 0) {
        return new ImageViewHolder(mLayoutInflater.inflate(R.layout.item_image, parent, false));
    } else {
        return new TextViewHolder(mLayoutInflater.inflate(R.layout.item_text, parent, false));
    }
} 
Run Code Online (Sandbox Code Playgroud)

上面的代码是正常的,但还有另一种方式.

其他方式

我想只有一个CustomViewHolder就足够了.

 class MultipleViewHolder extends RecyclerView.ViewHolder{
    TextView textView;
    ImageView imageView;

    MultipleViewHolder(View itemView, int type){
       if(type == 0){
         textView = (TextView)itemView.findViewById(xx);
       }else{
         imageView = (ImageView)itemView.findViewById(xx);
       }
    }
 }
Run Code Online (Sandbox Code Playgroud)

您在开发工作中使用哪种方式?

azi*_*ian 28

就个人而言,我喜欢Yigit Boyar本次演讲中提出的方法(快进到31:07).而不是返回的常量INTgetItemViewType(),直接返回布局ID,这也是一个int,并保证是唯一的:


    @Override
    public int getItemViewType(int position) {
        switch (position) {
            case 0:
                return R.layout.first;
            case 1:
                return R.layout.second;
            default:
                return R.layout.third;
        }
    }

这将允许您在以下方面实施以下内容onCreateViewHolder():


    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View view = inflater.inflate(viewType, parent, false);

        MyViewHolder holder = null;
        switch (viewType) {
            case R.layout.first:
                holder = new FirstViewHolder(view);
                break;
            case R.layout.second:
                holder = new SecondViewHolder(view);
                break;
            case R.layout.third:
                holder = new ThirdViewHolder(view);
                break;
        }
        return holder;
    }

MyViewHolder抽象类在哪里:


    public static abstract class MyViewHolder extends RecyclerView.ViewHolder {

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

            // perform action specific to all viewholders, e.g.
            // ButterKnife.bind(this, itemView);
        }

        abstract void bind(Item item);
    }

FirstViewHolder遵循:


    public static class FirstViewHolder extends MyViewHolder {

        @BindView
        TextView title;

        public FirstViewHolder(View itemView) {
            super(itemView);
        }

        @Override
        void bind(Item item) {
            title.setText(item.getTitle());
        }
    }

这将onBindViewHolder()成为一个单行:


    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        holder.bind(dataList.get(holder.getAdapterPosition()));
    }

因此,您将每个人ViewHolder分开,哪里bind(Item)将负责执行特定于此的操作ViewHolder.