RecyclerView通过多种布局 [英] RecyclerView With Multiple Layouts
问题描述
我使用RecyclerView显示在CardView文字,但我想补充一个头的TextView的,看起来像这样的RecyclerView的顶部:
所以我做了另一个布局文件top_header.xml只有一个TextView,但我不知道如何修改适配器获得两个布局在那里。
公共类适配器扩展RecyclerView.Adapter< Adapter.ViewHolder> {
名单< AdapterData> mItems;
公共适配器(){
超();
mItems =新的ArrayList< AdapterData>();
AdapterData数据=新AdapterData();
在data.set code(dummytext);
data.setResult(dummytext);
mItems.add(数据);
数据=新AdapterData();
在data.set code(dummytext);
data.setResult(dummytext);
mItems.add(数据);
数据=新AdapterData();
在data.set code(dummytext);
data.setResult(dummytext);
mItems.add(数据);
数据=新AdapterData();
在data.set code(dummytext);
data.setResult(dummytext);
mItems.add(数据);
数据=新AdapterData();
在data.set code(dummytext);
data.setResult(dummytext);
mItems.add(数据);
}
@覆盖
公众诠释getItemViewType(INT位置){
INT viewType = 0;
返回viewType;
}
@覆盖
公共ViewHolder onCreateViewHolder(ViewGroup中的父母,INT viewType){
如果(viewType == 0){
返回新ViewHolder(LayoutInflater.from(parent.getContext())膨胀(R.layout.top_textview,父母,FALSE));
}
返回新ViewHolder(LayoutInflater.from(parent.getContext())膨胀(R.layout.recycler_view_card_item,父母,FALSE));
}
@覆盖
公共无效onBindViewHolder(ViewHolder viewHolder,INT位置){
AdapterData数据= mItems.get(位置);
viewHolder code.setText(data.get code())。
viewHolder.result.setText(data.getResult());
}
@覆盖
公众诠释getItemCount(){
返回mItems.size();
}
类ViewHolder1扩展RecyclerView.ViewHolder {
公众的TextView头;
公共ViewHolder1(查看ItemView控件){
超(ItemView控件);
标题=(TextView中)itemView.findViewById(R.id.header_textview);
}
}
类ViewHolder2扩展RecyclerView.ViewHolder {
公众的TextView code;
公共TextView的结果;
公共ViewHolder2(查看ItemView控件){
超(ItemView控件);
code =(TextView中)itemView.findViewById(R.id.sims_ code);
结果=(TextView中)itemView.findViewById(R.id.sims_result);
}
}
}
如果您要添加多种类型的意见(超过2种),而不仅仅是一个头
和正常项目
CommonsWare答案是完美的。但是,如果上面提到的两个类型(头
和项目
)都够你,答案可以有很多更简单(从实用的角度)。
有,你可以使用两个相对简单的库:
-
RecyclerViewHeader
- 超级简单使用,但使用有点哈克的方式,有时可能会出现问题。适用于相对简单的报头。 -
HeaderRecyclerView
- 适用于任何类型的头。实现由 CommonsWare 提到的充气两种查看方式。有点难度使用比RecyclerViewHeader
但没有什么太难的日常使用。
有关信息披露:我的 作者 RecyclerViewHeader
。我知道它的缺点,所以我并不想推动它作为一换的解决办法,但更是一个有趣的替代复杂的适配器。 HeaderRecyclerView
是漂亮的一张code,可以简化您的工作。我用它自己,当我的 RecyclerView
头变得复杂了。的
I am using RecyclerView to display text in CardView but I want to add a Header TextView at the top of the RecyclerView that looks like this:
So I made another layout file "top_header.xml" with just a TextView but I am not sure how to modify the adapter to get both layouts in there.
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);
}
}
}
If you want to add multiple types of views (more than 2 types) and not just a header
and "normal" item
, CommonsWare answer is perfect. But if the two mentioned types (header
and item
) are enough for you, the answer can be a lot simpler (from the practical point of view).
There are two relatively simple libraries that you can use for that:
RecyclerViewHeader
- super simple to use, but uses a bit "hacky" approach, that sometimes can cause problems. Suitable for relatively simple headers.HeaderRecyclerView
- Suitable for any type of header. Implements approach mentioned by CommonsWare to inflate two types of views. A bit more difficult to use thanRecyclerViewHeader
but nothing too hard to use on a daily basis.
For disclosure: I am the author of the RecyclerViewHeader
. I'm aware of its flaws, therefore I'm not trying to promote it as one-for-all solution, but more as an interesting alternative to complicating your adapter. HeaderRecyclerView
is a nice piece of code that can simplify your work. I use it myself when my RecyclerView
header gets complicated.
这篇关于RecyclerView通过多种布局的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!