RecyclerView通过多种布局 [英] RecyclerView With Multiple Layouts

查看:149
本文介绍了RecyclerView通过多种布局的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用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答案是完美的。但是,如果上面提到的两个类型(项目)都够你,答案可以有很多更简单(从实用的角度)。

有,你可以使用两个相对简单的库:

  1. RecyclerViewHeader - 超级简单使用,但使用有点哈克的方式,有时可能会出现问题。适用于相对简单的报头。

  2. 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:

  1. RecyclerViewHeader - super simple to use, but uses a bit "hacky" approach, that sometimes can cause problems. Suitable for relatively simple headers.

  2. HeaderRecyclerView - Suitable for any type of header. Implements approach mentioned by CommonsWare to inflate two types of views. A bit more difficult to use than RecyclerViewHeader 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆