我需要将 RecyclerView 中的元素划分为具有标题的组(如下图的收件箱应用程序中所示),因此请帮助我找出哪种方法更适合我的情况:
1)我可以使用异构布局,但在组中插入新元素不太方便(因为我需要检查是否已添加同一组的元素或者我需要添加新的分隔符)。因此,在这种情况下,我会将具有此类数据结构的所有操作包装到一个单独的类中。
2)理论上我可以将每个组包装在自己的带有标签的RecyclerView中,这是一个好主意吗?
例如,您可以:
Use a TreeMap<Date,List<Event>>
用于按日期拆分元素。这将是保存您的业务对象的集合。当然,如果您已经有类似的结构,则可以保留它。重要的是要有一些东西可以轻松构建项目列表,以便使用正确的元素顺序填充 UI。
-
定义专用的抽象类型List
物品(例如ListItem
)来包装您的业务对象。它的实现可能是这样的:
public abstract class ListItem {
public static final int TYPE_HEADER = 0;
public static final int TYPE_EVENT = 1;
abstract public int getType();
}
-
为每个列表元素类型定义一个类(这里我只添加了两种类型,但您可以根据需要使用多种类型):
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;
}
}
-
创建一个List如下(其中mEventsMap是在点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
,致力于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 https://github.com/thetonrifles/stackoverflow/tree/so-34848401它是 GitHub 上的一个存储库,提供上述方法的实现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)