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没有收到通知”

Android ListView 不会在滚动时重绘

停止 ListView 滚动动画

为啥当设备在 android 中水平时,ListView 内的嵌套自定义视图会阻止正确聚焦?

Android的RecyclerView