在同一个适配器中填充不同类型的arraylist

时间:2018-03-22 07:59:17

标签: android android-recyclerview

我正在使用RecyclerView,适配器和XML在3个活动中与RecyclerView相同。问题出在getItemCount(),因为在同一个适配器中填充了3种不同类型的ArrayList

如何在同一个适配器上使用不同类型的ArrayList

3 个答案:

答案 0 :(得分:1)

此适配器类实现可以让您了解要实现的目标

class GenericAdapter extends RecyclerView.Adapter<GenericAdapter.ViewHolder> {

    private List<?> data;

    GenericAdapter(List<?> data) {
        this.data = data;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        ...
        ...
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.bindData(data.get(position));
    }

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


    class ViewHolder extends RecyclerView.ViewHolder {

        ...
        ...

        ViewHolder(View itemView) {
            super(itemView);
            // bind the view references
            ...
            ...
        }


        void bindData(Object data) {
            if (data instanceof Model1) {
                // bind data for model class 1
                ...
                ...
            } else if (data instanceof Model2) {
                // bind data for model class 2
                ...
                ...
            } else if (data instanceof Model3) {
                // bind data for model class 3
                ...
                ...
            }
        }
    }

}

答案 1 :(得分:0)

我建议您构建一个接口,该接口由您创建的3个ArrayList扩展实现,并包含Recycler适配器所需的方法。

答案 2 :(得分:0)

首先你需要创建3个Getter-Setter。例如 ModelAModelBModelC

现在创建一个Object的arraylist,它接受任何类型的类对象。例如

ArrayList<Object> objectList = new ArrayList<>();

现在,您需要objectList添加模型objectList.add(modelA); 这里modelAModelA类的对象。

现在您必须在适配器中使用此objectList,然后主要部分来了,您必须在适配器的onBindViewHolder方法中创建条件。像这样,

if(objectList.get(position) instanceof ModelA){
     //TODo your ModelA operations
}else if (objectList.get(position) instanceof ModelB){
     //TODo your ModelB operations
}else if (objectList.get(position) instanceof ModelC){
     //TODo your ModelC operations
}

这对你有用,因为你有相同的布局,否则你必须使用ViewTypes