Android中的倒置ListView?
Posted
技术标签:
【中文标题】Android中的倒置ListView?【英文标题】:Inverted ListView in Android? 【发布时间】:2012-06-12 01:38:45 【问题描述】:有没有一种简单的方法可以以相反的顺序显示 ListView?我正在尝试创建一个基于对话的应用程序,并且希望最近的条目位于 ListView 的底部。我知道 transcriptMode 和 stackFromBottom,但是我的问题是数据的顺序。
假设我有 100 个对话项目,并且想要显示项目 80-100,其中 100 是最近的对话项目。我想显示 80-100,这意味着我的查询中有一个 ORDER BY id desc LIMIT 20,它强制将项目排序为 100 到 80,这与我需要的相反。我目前有一些讨厌的内部查询代码,但感觉应该有一个基于反转光标或简单反转 ListView 的更简单的解决方案。
【问题讨论】:
不确定它是否有效,但您可以简单地查询所有项目,在返回的Cursor
中创建最后 20 个数组,然后从数组中创建一个 MatrixCursor
并使用它对于ListView
。见developer.android.com/reference/android/database/…
【参考方案1】:
在 baseAdapter
内部,对于 getView()
方法,不是在索引“位置”中获取数据中的项目,而是使用相反的含义: numberOfItems 减去位置。
至于显示项目的数量,这也在 baseAdapter 内部:将getCount()
返回的值设置为您希望的值(在您的示例中为 20,尽管 80-100 意味着它应该是 21 ) .
顺便说一句,在 listView 的情况下,您似乎是首发。我可以建议观看此视频吗: http://www.youtube.com/watch?v=wDBM6wVEO70
还要检查 sdk manager 提供的 api-demos。他们那里有很多例子。
【讨论】:
谢谢,我认为这是最好的方法。我正在考虑将 Cursor 子类化以创建 ReverseCursor,并考虑更改 ListView,但它们之间的部分是明确的选择。我刚刚观看了 Romain 在 2009 年关于 Android 性能的 I/O 演讲,其中暗示了这个方向,感谢 ListView 演讲的指针。【参考方案2】:在适配器中使用此 getItem 方法进行逆序:
@Override
public Object getItem(int position)
return super.getItem(super.getCount() - position - 1);
【讨论】:
您能告诉我如何覆盖适配器中的 getItem() 方法吗? 但它显示了一条消息,这里不允许使用@Override。我正在尝试覆盖 onCreate 方法【参考方案3】:从数据库中提取数据时,此代码对我有用。
cs.moveToPosition(super.getCount() - position - 1); //cs is Cursor
【讨论】:
【参考方案4】:使用 BETWEEN 关键字查询记录对我来说似乎是最简单的解决方案。
【讨论】:
谢谢,BETWEEN 很有帮助,但对我来说不太好用,因为我不想添加查询来查找最后一条数据的位置。以上是关于Android中的倒置ListView?的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 中的顶部 ListView 项目上方(以及最后一个项目下方)添加边距
Android,ListView IllegalStateException:“适配器的内容已更改但ListView没有收到通知”