afollestad sectionedRecyclerView库。如何为每个项目使用单独的ViewHolders

时间:2017-07-17 14:09:52

标签: android android-recyclerview recycler-adapter expandablerecyclerview

我一直在尝试在我的应用中实现这个sectionedRecyclerView库,但是我需要它来处理没有部分页眉/页脚(同时仍然显示项目)和存在的情况。该库总是至少需要1个部分/标题。

此外,该库只有一个viewHodler。 我希望能够使用不同的viewHolders ,用于项目,页眉和页脚。

我需要使用哪些方法来覆盖/更改才能完成此操作?

1 个答案:

答案 0 :(得分:0)

首先,你的模型上应该有一个类型变量。

public class MyModel{
    private int type;
    //setters and getters...
}

然后,在您的适配器上创建2个ViewHolders,但是您将在Adapter<>上使用的类。将是母班(ViewHolder)。

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    class ViewModel1 extends RecyclerView.ViewHolder{
        //your code
    }

    class ViewModel2 extends RecyclerView.ViewHolder{
        //your code
    }
}

之后,您应该在适配器上实现一些方法。

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private List<MyModel> mModelList;

    public MyAdapter(List<MyModel> models){
        this.mModelList = models;
    }

    @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view;
        LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        switch (viewType) {
            case TYPE_1:
                view = inflater.inflate(R.layout.view_type_1, parent, false);
                return new ViewModel1(view);
            case TYPE_2:
                view = inflater.inflate(R.layout.view_type_2, parent, false);
                return new ViewModel2(view);
        }
        return null;
    }

    @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        final MyModel item = mModelList.get(position);
        switch (item.type) {
            case TYPE_1:
                final ViewHolder1 vh1 = (ViewHolder1)holder;
                //your code
            break;
        case TYPE_2:
            final ViewHolder2 vh2 = (ViewHolder2)holder;
            //your code
            break;
       }
    }

    @Override public int getItemViewType(int position) {
        return mModelList.get(position).type;
    }

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