Android 具有多个布局的RecyclerView
我正在使用RecyclerView在CardView中显示文本,但我想在RecyclerView顶部添加一个标题文本视图,如下所示: 因此,我制作了另一个布局文件“top_header.xml”,其中只有一个文本视图,但我不确定如何修改适配器以将两个布局都放在其中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
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代码