【发布时间】:2016-04-14 12:58:01
【问题描述】:
我有一长串从 SQLite 数据库中检索的对象。为简化起见,假设Event 对象具有Date、Name 和Location 属性。
使用以下列表适配器并从按Date 排序的数据库中获取Events,我可以拥有Events 的时间顺序ListView。
public class ImageListButtonListAdapter extends ArrayAdapter<ImageListButtonListItem> {
public ImageListButtonListAdapter(Context c, List<ImageListButtonListItem> items) {
super(c, 0, items);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageListButtonView itemView = (ImageListButtonView)convertView;
if (null == itemView)
itemView = ImageListButtonView.inflate(parent);
itemView.setItem(getItem(position));
return itemView;
}
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
}
}
到目前为止,一切都很好。现在这个列表很长,我想使用ExpandableListView 进一步构建列表,并按月对Event 项目进行分组。我发现创建从BaseExpandableListAdapter 派生的列表适配器的示例通常包括预定义的组和组名。我只有一大组项目,每个项目都包含一个(Joda Time)LocalDate,在此基础上我可以添加一个可用于排序的计算属性YearMonth。
我的第一个想法是将整个列表传递给适配器,让适配器确定组,并在创建适配器时将项目分配给组。但我担心以这种方式处理整个列表、创建组并将项目分配给这些组,然后才能显示列表,这在已经对性能敏感的视图中是一个代价高昂的过程。
我可以想象这是一个相当常见的场景,并且有一种更优雅的方法来解决它。最好的方法是什么?
【问题讨论】:
-
您能否将数据模型的代码也添加到问题中。为什么不能在将数据放入
ListView之前以正确的方式对数据进行排序? -
是的,这就是我现在的方法。我让它以某种方式与棒棒糖一起工作,后来。在较旧的设备上,该列表仍然是空的。我会清理一些代码并在短时间内将其添加到问题中。谢谢。
-
我用当前代码更新了问题。我希望片段能揭示有关数据模型的足够信息——尽量避免发布过多的代码。
-
在不知道你有多少数据的情况下,我建议你往后退一步,看看你的
DatabaseManager,看看你是否可以选择数据并将其正确分组,然后再从数据库。我一直学到的一件事是,无论您可以将什么工作移交给数据库,您都应该这样做,因为数据库引擎在速度方面大多优于 Java 等编程语言。 -
@Darwind 好的,修复了一个不相关的小问题(主要是在我的脑海中:))。该代码实际上独立于 android 版本工作。我可以再次删除附加信息,因为答案并不真正依赖于此(或者它实际上就是答案)。既然您遇到了麻烦,我非常感谢您,并且基本上以您的第一条评论回答了它,您想发布一个正式的答案,以便我给予信任吗?
标签: android sqlite listview expandablelistview