Android 具有多个布局的RecyclerView

Android 具有多个布局的RecyclerView,android,android-recyclerview,Android,Android Recyclerview,我正在使用RecyclerView在CardView中显示文本,但我想在RecyclerView顶部添加一个标题文本视图,如下所示: 因此,我制作了另一个布局文件“top_header.xml”,其中只有一个文本视图,但我不确定如何修改适配器以将两个布局都放在其中 public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> { List<AdapterData> mItems; publ

我正在使用RecyclerView在CardView中显示文本,但我想在RecyclerView顶部添加一个标题文本视图,如下所示:

因此,我制作了另一个布局文件“top_header.xml”,其中只有一个文本视图,但我不确定如何修改适配器以将两个布局都放在其中

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

List<AdapterData> mItems;

public Adapter() {
    super();
    mItems = new ArrayList<AdapterData>();
    AdapterData data = new AdapterData();
    data.setCode("dummytext");
    data.setResult("dummytext");
    mItems.add(data);

    data = new AdapterData();
    data.setCode("dummytext");
    data.setResult("dummytext");
    mItems.add(data);

    data = new AdapterData();
    data.setCode("dummytext");
    data.setResult("dummytext");
    mItems.add(data);

    data = new AdapterData();
    data.setCode("dummytext");
    data.setResult("dummytext");
    mItems.add(data);

    data = new AdapterData();
    data.setCode("dummytext");
    data.setResult("dummytext");
    mItems.add(data);

}

@Override
public int getItemViewType(int position) {
    int viewType = 0;
    return viewType;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == 0) {
        return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.top_textview, parent, false));
    }

    return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view_card_item, parent, false));
}

@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
    AdapterData data = mItems.get(position);
    viewHolder.code.setText(data.getCode());
    viewHolder.result.setText(data.getResult());

}


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


class ViewHolder1 extends RecyclerView.ViewHolder{
    public TextView header;

    public ViewHolder1(View itemView) {
        super(itemView);
        header = (TextView)itemView.findViewById(R.id.header_textview);

    }
}

class ViewHolder2 extends RecyclerView.ViewHolder{
    public TextView code;
    public TextView result;

    public ViewHolder2(View itemView) {
        super(itemView);
        code = (TextView)itemView.findViewById(R.id.sims_code);
        result = (TextView)itemView.findViewById(R.id.sims_result);

    }
}


}
公共类适配器扩展了RecyclerView.Adapter{
列出螨类;
公共适配器(){
超级();
mItems=新的ArrayList();
AdapterData=新AdapterData();
data.setCode(“dummytext”);
data.setResult(“dummytext”);
添加(数据);
数据=新适配器数据();
data.setCode(“dummytext”);
data.setResult(“dummytext”);
添加(数据);
数据=新适配器数据();
data.setCode(“dummytext”);
data.setResult(“dummytext”);
添加(数据);
数据=新适配器数据();
data.setCode(“dummytext”);
data.setResult(“dummytext”);
添加(数据);
数据=新适配器数据();
data.setCode(“dummytext”);
data.setResult(“dummytext”);
添加(数据);
}
@凌驾
public int getItemViewType(int位置){
int viewType=0;
返回视图类型;
}
@凌驾
public ViewHolder onCreateViewHolder(视图组父级,int-viewType){
如果(viewType==0){
返回新的ViewHolder(LayoutInflater.from(parent.getContext()).flate(R.layout.top_textview,parent,false));
}
返回新的ViewHolder(LayoutInflater.from(parent.getContext())。充气(R.layout.recycler\u view\u card\u item,parent,false));
}
@凌驾
公共无效onBindViewHolder(ViewHolder ViewHolder,int位置){
AdapterData=mItems.get(位置);
viewHolder.code.setText(data.getCode());
viewHolder.result.setText(data.getResult());
}
@凌驾
public int getItemCount(){
返回mItems.size();
}
类ViewHolder1扩展了RecyclerView.ViewHolder{
公共文本视图标题;
公共视图持有者1(视图项视图){
超级(项目视图);
header=(TextView)itemView.findViewById(R.id.header\u TextView);
}
}
类ViewHolder2扩展了RecyclerView.ViewHolder{
公共文本视图代码;
公共文本查看结果;
公共视图持有者2(视图项视图){
超级(项目视图);
代码=(TextView)itemView.findViewById(R.id.sims_代码);
结果=(TextView)itemView.findViewById(R.id.sims\u结果);
}
}
}

您需要进行三项更改:

  • RecyclerView.Adapter
    上实现
    getItemViewType()
    ,根据提供的
    位置
    为应用程序所需的每个视图类型返回唯一的整数。因此,您将为标题返回一个值(可能是
    0
    position
    ),并为其他所有内容返回另一个值

  • 注意传递到
    onCreateViewHolder()
    中的
    viewType
    参数,并根据需要创建适当的
    RecyclerView.ViewHolder
    。这反过来可能意味着您的标题行和详细信息行应该有不同的
    ViewHolder

  • onbindwiewholder()
    中,根据您获得的
    ViewHolder
    类型应用绑定逻辑,以便将适当的数据绑定到
    ViewHolder
    中。您可以使用
    instanceof
    ,或者让
    ViewHolder
    类实现一个公共接口,或者其他任何方法来实现这一功能


  • 演示带有节标题的
    RecyclerView
    ,该节标题实现了上述步骤。

    必须创建不同类型的视图持有者,并根据视图持有者视图绑定数据。如果您想添加多种类型的视图(超过2种类型),而不仅仅是
    标题和“普通”
    项,那么这个问题已经在这里提出并回答了,它将帮助您。但是如果上面提到的两种类型(
    标题
    项目
    )对您来说已经足够了,那么答案可能会简单得多(从实用的角度来看)

    您可以使用两个相对简单的库:

  • -超级简单易用,但使用了一些“黑客”方法,这有时会导致问题。适用于相对简单的标题

  • -适用于任何类型的收割台。实现了中提到的方法来膨胀两种类型的视图。使用起来比使用循环服务阅读器要困难一些,但没有什么比日常使用更难的了


  • 披露:我是这本书的作者。我知道它的缺陷,因此我不想把它推广为一对所有的解决方案,而是作为一个有趣的替代方案,以使适配器复杂化。是一段很好的代码,可以简化您的工作。当我的
    RecyclerView
    标题变得复杂时,我自己会使用它。

    好的,我已经到了这一点,我认为它是正确的,但不确定我应该如何使用当前的onBindViewHolder代码创建另一个更新的BindHolder代码