除以在RecyclerView组元素 [英] Divide elements on groups in RecyclerView

查看:234
本文介绍了除以在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的<日期,列表与LT;事件>> 按日期拆分元素。这将是保持你的业务对象的集合。当然,如果你已经有了一个类似的结构,你可以把它。有东西容易构建的产品清单用于填充右元素为了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.

列表项目专用的抽象类型(如列表项)来包装你的业务对象。它的实现可能是这样的:

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();
} 


  • 定义一个类为每个列表元素类型的(这里我只增加了两种,但因为你需要,你可以使用许多):

  • 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 {
    
        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 {
    
        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.put(event);
        }
    }
    


  • 定义你的 RecyclerView ,在工作表点4.这里定义的是一个适配器重要的是要覆盖 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 SpecialsViewHolder(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
        }
    }
    


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

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