gpt4 book ai didi

android - 在 RecyclerView 中按组划分元素

转载 作者:IT王子 更新时间:2023-10-29 00:00:58 24 4
gpt4 key购买 nike

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

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

Inbox app

最佳答案

例如,您可以:

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

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

    public abstract class ListItem {

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

    abstract public int getType();
    }
  3. 为每个 List 元素类型定义一个类(这里我只添加了两种类型,但您可以根据需要使用多种类型):

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

    }
  4. 如下创建一个列表(其中 mEventsMap 是在第 1 点构建的 map ):

    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);
    }
    }
  5. 为您的RecyclerView 定义一个适配器, 正在处理 List在第 4 点定义。这里重要的是覆盖 getItemViewType方法如下:

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

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

    @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
    }
    }

Here它是 GitHub 上的一个存储库,提供上述方法的实现。

关于android - 在 RecyclerView 中按组划分元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34848401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com