Android中的倒置ListView?

7
有没有一种简单的方法来倒序显示ListView?我正在尝试创建一个基于对话的应用程序,并希望最新的条目显示在ListView底部。我知道transcriptMode和stackFromBottom,但是我的问题是数据的顺序。
假设我有100个对话项,想要显示80-100项,其中100是最新的对话项。我想显示80-100,这意味着在我的查询中使用ORDER BY id desc LIMIT 20,它强制项目按100到80排序,与我需要的相反。我目前有一些令人讨厌的内部查询代码,但感觉应该有一种更简单的解决方案,可以根据翻转游标或简单地反转ListView来实现。

不确定是否可行,但您可以简单地查询所有项目,创建返回的Cursor中最后20个项目的数组,然后从该数组创建一个MatrixCursor并将其用于ListView。请参阅http://developer.android.com/reference/android/database/MatrixCursor.html。 - Squonk
4个回答

10
baseAdapter 中的 getView() 方法中,不要使用数据中索引为 "position" 的项目,而是使用相反的方式,即:项目数减去位置。
至于显示项目数量,也在 baseAdapter 中:将 getCount() 返回的值设置为您希望的值(例如,在您的示例中为20,但80-100意味着应该是21)。
顺便说一句,似乎你是刚开始接触listView。我建议观看这个视频:http://www.youtube.com/watch?v=wDBM6wVEO70 还要检查SDK管理器提供的api-demos。那里有很多例子。

谢谢,我认为这是最好的方法。我曾考虑过通过子类化Cursor来创建ReverseCursor,也考虑过修改ListView,但它们之间的部分是明显的选择。我刚刚看了Romain在2009年Android性能方面的演讲,他暗示了这个方向,感谢你指向了ListView的讲话。 - bjdodson

10

在适配器中使用这个getItem方法,以进行倒序排序:

@Override
public Object getItem(int position) {
   return super.getItem(super.getCount() - position - 1);
}

请问您如何在适配器中重写getItem()方法? - Apurva
但它显示一个消息,@Override 在这里不被允许。我正在尝试在onCreate方法内进行重写。 - Apurva

1
这段代码适用于我从数据库中提取数据时使用。
cs.moveToPosition(super.getCount() - position - 1); //cs is Cursor

0

使用BETWEEN关键字查询记录对我来说似乎是最简单的解决方案。


谢谢,BETWEEN对我有帮助,但不太适用于我的情况,因为我不想添加一个查询来查找最后一条数据的位置。 - bjdodson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接