You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于API返回数据,如何用HashMap实现RecyclerView的Header与Item?

实现带分组Header的RecyclerView(基于HashMap)

1. 数据分组存储

根据你的API返回格式(按日期分组的结构),用HashMap<String, List<YourItemModel>>来存储分组数据:String作为日期Header的键,List<YourItemModel>对应该日期下的所有内容项。

先定义内容项的实体类(示例):

public class OrderItem {
    private String orderId;
    private String status;
    private String date; // 用于提取分组的日期字段
    // 其他字段根据API返回补充
    // getter、setter方法
}

将API返回数据解析并分组:

// 假设已将API返回数据解析为List<OrderItem>
List<OrderItem> allItems = parseApiResponse(apiJsonData);
HashMap<String, List<OrderItem>> groupedData = new HashMap<>();

for (OrderItem item : allItems) {
    String date = item.getDate();
    if (!groupedData.containsKey(date)) {
        groupedData.put(date, new ArrayList<>());
    }
    groupedData.get(date).add(item);
}

2. 整理扁平列表(供Adapter使用)

HashMap是无序的,需要把Header和对应Item整理成有序的扁平列表,方便Adapter识别类型:

List<Object> flatList = new ArrayList<>();
// 对日期排序(可选,按业务需求调整)
List<String> sortedDates = new ArrayList<>(groupedData.keySet());
Collections.sort(sortedDates);

for (String date : sortedDates) {
    flatList.add(date); // 添加日期Header
    flatList.addAll(groupedData.get(date)); // 添加该日期下的所有内容项
}

3. 实现RecyclerView.Adapter

先定义类型常量区分Header和Item:

private static final int TYPE_HEADER = 0;
private static final int TYPE_ITEM = 1;

完整Adapter代码:

public class GroupedOrderAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private List<Object> flatList;

    public GroupedOrderAdapter(List<Object> flatList) {
        this.flatList = flatList;
    }

    @Override
    public int getItemViewType(int position) {
        return flatList.get(position) instanceof String ? TYPE_HEADER : TYPE_ITEM;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        if (viewType == TYPE_HEADER) {
            View headerView = inflater.inflate(R.layout.item_header_date, parent, false);
            return new HeaderViewHolder(headerView);
        } else {
            View itemView = inflater.inflate(R.layout.item_order_content, parent, false);
            return new ItemViewHolder(itemView);
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof HeaderViewHolder) {
            String date = (String) flatList.get(position);
            ((HeaderViewHolder) holder).tvDate.setText(date);
        } else if (holder instanceof ItemViewHolder) {
            OrderItem item = (OrderItem) flatList.get(position);
            ((ItemViewHolder) holder).tvOrderId.setText(item.getOrderId());
            ((ItemViewHolder) holder).tvStatus.setText(item.getStatus());
            // 绑定其他字段
        }
    }

    @Override
    public int getItemCount() {
        return flatList.size();
    }

    // Header ViewHolder
    static class HeaderViewHolder extends RecyclerView.ViewHolder {
        TextView tvDate;

        public HeaderViewHolder(@NonNull View itemView) {
            super(itemView);
            tvDate = itemView.findViewById(R.id.tv_header_date);
        }
    }

    // 内容项 ViewHolder
    static class ItemViewHolder extends RecyclerView.ViewHolder {
        TextView tvOrderId;
        TextView tvStatus;

        public ItemViewHolder(@NonNull View itemView) {
            super(itemView);
            tvOrderId = itemView.findViewById(R.id.tv_order_id);
            tvStatus = itemView.findViewById(R.id.tv_order_status);
        }
    }
}

4. 布局文件示例

  • 头部布局item_header_date.xml:
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tv_header_date"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="16dp"
    android:textSize="16sp"
    android:textStyle="bold"
    android:background="#f5f5f5"/>
  • 内容项布局item_order_content.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="16dp"
    android:background="#ffffff">

    <TextView
        android:id="@+id/tv_order_id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="14sp"/>

    <TextView
        android:id="@+id/tv_order_status"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="12sp"
        android:textColor="#666666"
        android:layout_marginTop="4dp"/>

</LinearLayout>

5. 初始化RecyclerView

RecyclerView recyclerView = findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
GroupedOrderAdapter adapter = new GroupedOrderAdapter(flatList);
recyclerView.setAdapter(adapter);

内容的提问来源于stack exchange,提问作者Robby Ali Darmawan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 04:52:06