【问题标题】:How to display multiple ViewTypes in a single RecycleView?如何在单个 RecyclerView 中显示多个视图类型?
【发布时间】:2019-12-12 11:04:52
【问题描述】:

我用一个 ViewHolder 创建了一个简单的 RecycleView,但后来我想添加另一个并将它们显示在同一个 recyclerView 中,所以我不得不创建另一个 ViewHolder。

我尝试遵循以下建议:How to set two adapters to one RecyclerView?
他试图制作一个简单的绑定方法,但对我不起作用。

它说我应该显示 ViewHolder 的一个对象,但我该怎么做呢?

感谢您的任何建议。

代码:

some package, imports; *

public class MultiAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    public static class FirstViewHolder extends RecyclerView.ViewHolder{

        TextView second_segment;

        private FirstViewHolder( View itemView) {
            super(itemView);
            second_segment = itemView.findViewById(R.id.segment_tuesday);

        }
        **private void bind(MultiAdapter firstObj) {
            Exercise exercise = new Exercise();
            //firstObj = exercise;
        }**
    }
    public static class SecondViewHolder extends RecyclerView.ViewHolder {
        TextView first_segment;

        private SecondViewHolder( View itemView) {
            super(itemView);
            first_segment = itemView.findViewById(R.id.segment_monday);

        }
        **private void bind(MultiAdapter secondObj) {
            Exercise exercise = new Exercise();
            //secondObj = exercise;
        }**
    }


    private static int ITEM_TYPE_C_T;
    private static int ITEM_TYPE_S_B;


    private List<Object> items = new ArrayList<>();

    public MultiAdapter(List<Object> items){
        this.items.addAll(items);
    }

    @Override
    public int getItemViewType(int position) {
        if (items.get(position) instanceof MultiAdapter) {
            return ITEM_TYPE_C_T;
        }
        else{
            return ITEM_TYPE_S_B;
        }
    }

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

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());

        if (viewType == ITEM_TYPE_S_B){
            View view = layoutInflater.inflate(R.layout.segment_exmpl1,parent,false);
            return new SecondViewHolder(view);
        } else {
            View view = layoutInflater.inflate(R.layout.segment_exmpl2,parent,false);
            return new FirstViewHolder(view);
        }
    }

    @Override
    **public void onBindViewHolder(@NonNull RecyclerView.ViewHolder Holder, int position) {
        Object item = items.get(position);
        if (Holder instanceof FirstViewHolder) {
            FirstViewHolder viewHolder0 = (FirstViewHolder) Holder;
            //((FirstViewHolder) Holder).bind((FirstObj) item);
        } else {
            SecondViewHolder viewHolder0 = (SecondViewHolder) Holder;
            //((SecondViewHolder) Holder).bind((SecondObj) item);
        }
    }**



}

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    在 Activty/Fragment 中,准备带有 id 的模型对象。

    private  void prepareDataSet(){
             List<Object> items = new ArrayList<>();
             items.add(new Object(id1));
             items.add(new Object(id2));
             items.add(new Object(id1));
             items.add(new Object(id2));
             multiAdapter.notifyDataSetChanged();
    
    }
    

    在 Adapter 类中,修改你的逻辑如下

     @Override
        public int getItemViewType(int position) {
            if (items.get(position).id=id1) {
                return ITEM_TYPE_C_T;
            }
            else if(items.get(position).id=id2){
                return ITEM_TYPE_S_B;
            }else {
                return DEFAULT_VIEW;
            }
        }
    
    
    
    @NonNull
        @Override
            public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
    
                if (viewType == ITEM_TYPE_S_B){
                    View view = layoutInflater.inflate(R.layout.segment_exmpl1,parent,false);
                    return new SecondViewHolder(view);
                } else if(viewType == ITEM_TYPE_S_B) {
                    View view = layoutInflater.inflate(R.layout.segment_exmpl2,parent,false);
                    return new FirstViewHolder(view);
                }else{
        //to prevent crash on null
                    View view = layoutInflater.inflate(R.layout.default_view,parent,false);
                    return new DefaultHolder(view);
        }
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-05
      • 2020-02-26
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 2018-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多