在 RecyclerView 中划分组上的元素 [英] Divide elements on groups in RecyclerView

查看:21
本文介绍了在 RecyclerView 中划分组上的元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要将 RecyclerView 中的元素划分为带有标题的组(如下图的收件箱应用程序中所示),因此请帮助我弄清楚哪种方法更适合我的情况:1)我可以使用异构布局,但在组中插入新元素不太方便(因为我需要检查是否已经添加了同一组的元素或者我需要添加新的分隔线).因此,在这种情况下,我会将具有此类数据结构的所有操作包装到一个单独的类中.

I need to divide elements in RecyclerView on groups with titles (like in the Inbox app on the picture below) so help me please to figure out what approach would be better for my case: 1) I can use Heterogenous layouts for it but it is not so convenient to insert new elements in groups (because I need check if elements of the same group is already added or I need to add new divider). So in this case I'll wrap all operations with such data structure into a separate class.

2) 理论上我可以用标签将每个组包装在自己的 RecyclerView 中,这是个好主意吗?

2) Theoretically I can wrap each group in its own RecyclerView with label is it a good idea?

推荐答案

例如您可以:

  1. 使用 TreeMap> 按日期拆分元素.这将是一个用于保存您的业务对象的集合.当然,如果你已经有一个类似的结构,你可以保留它.有一些东西可以轻松构建项目列表,以使用正确的元素顺序填充 UI,这一点很重要.

  1. Use a TreeMap<Date,List<Event>> for splitting elements by date. This will be a collection for keeping your business objects. Of course if you already have a similar structure you can keep it. It's just important to have something for easily building list of items for populating UI with right elements order.

List 项(例如 ListItem)定义专用抽象类型来包装您的业务对象.它的实现可能是这样的:

Define a dedicated abstract type for List items (e.g. ListItem) to wrap your business objects. Its implementation could be something like this:

public abstract class ListItem {

    public static final int TYPE_HEADER = 0;
    public static final int TYPE_EVENT = 1;

    abstract public int getType();
} 

  • 为每个 List 元素类型定义一个类(这里我只添加了两种类型,但您可以根据需要使用多种类型):

  • Define a class for each of your List element type (here I added just two types but you can use many as you need):

    public class HeaderItem extends ListItem {
    
        private Date date;
    
        // here getters and setters 
        // for title and so on, built
        // using date
    
        @Override
        public int getType() {
            return TYPE_HEADER;
        }
    
    }
    
    public class EventItem extends ListItem {
    
        private Event event;
    
        // here getters and setters 
        // for title and so on, built 
        // using event
    
        @Override
        public int getType() {
            return TYPE_EVENT;
        }
    
    }
    

  • 按如下方式创建一个列表(其中 mEventsMap 是点 1 的地图构建):

  • Create a List as follows (where mEventsMap is map build at point 1):

    List<ListItem> mItems;
    // ...
    mItems = new ArrayList<>();
    for (Date date : mEventsMap.keySet()) {
        HeaderItem header = new HeaderItem();
        header.setDate(date); 
        mItems.add(header);
        for (Event event : mEventsMap.get(date)) {
            EventItem item = new EventItem();
            item.setEvent(event);
            mItems.add(item);
        }
    }
    

  • 为您的 RecyclerView 定义一个适配器,处理在第 4 点定义的 List.这里重要的是覆盖 getItemViewType方法如下:

  • Define an adapter for your RecyclerView, working on List defined at point 4. Here what is important is to override getItemViewType method as follows:

    @Override
    public int getItemViewType(int position) {
        return mItems.get(position).getType();
    }
    

    然后你需要有两个布局和用于标题和事件项的 ViewHolder.适配器方法应该相应地处理这个:

    Then you need to have two layouts and ViewHolder for header and event items. Adapter methods should take care of this accordingly:

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == ListItem.TYPE_HEADER) {
            View itemView = mLayoutInflater.inflate(R.layout.view_list_item_header, parent, false);
            return new HeaderViewHolder(itemView);
        } else {
            View itemView = mLayoutInflater.inflate(R.layout.view_list_item_event, parent, false);
            return new EventViewHolder(itemView);
        }
    }
    
    
    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder viewHolder, final int position) {
        int type = getItemViewType(position);
        if (type == ListItem.TYPE_HEADER) {
            HeaderItem header = (HeaderItem) mItems.get(position);
            HeaderViewHolder holder = (HeaderViewHolder) viewHolder;
            // your logic here
        } else {            
            EventItem event = (EventItem) mItems.get(position);
            EventViewHolder holder = (EventViewHolder) viewHolder;
            // your logic here
        }
    }
    

  • 这里是 GitHub 上的存储库,提供了所解释方法的实现多于.

    Here it is a repository on GitHub providing an implementation of the approach explained above.

    这篇关于在 RecyclerView 中划分组上的元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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