基于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
相关产品推荐
相关产品推荐

