android:stackFromBottom =“true”似乎不能正常工作(反向ListView与适配器)

时间:2014-03-28 16:27:31

标签: android android-listview android-adapter android-adapterview

好的,让我解释“完美无效”的含义。

我有一个没有android:stackFromBottom="true"参数的列表视图。我还有一个常规getItem(position)的ArrayAdapter。我打电话给我的网络服务器,获取asc日期订单的数据。

这样,列表中位置0(顶部)的项目具有最小的日期。我可以滚动顶部>底部。好。

我添加了android:stackFromBottom,现在我看到现在你可以从底部>顶部开始掠夺,但位置0中的项目仍然是顶级项目,并且日期最小。所以适配器没有改变它的顺序。

解决此问题的唯一方法是更改​​适配器内的getItem(getCount()-1-position)。但是,我添加并通知适配器,适配器仍然会将项目添加到底部。

我猜结构是ListView -> Adapter -> Row Views所以无论stackFromBottom值是什么,只有一个子节点,即适配器。正确?

无论如何,如何以相反的顺序使用适配器的ListView?

5 个答案:

答案 0 :(得分:5)

这样做的一个很好的方法是覆盖你的Adapter.getItem()方法,以相反的顺序返回项目。

这是Adapter的一个很好的模式,因为它不需要为了显示目的而对数据进行不同的排序(排序列表可能会有开销,或原始订单重要的其他原因在应用程序的另一部分)。

而是适配器显示更改而不影响基础数据集。

以下是我使用的内容:

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

这是基于此问题的@mes's answer

查看该主题,讨论其他可能的解决方案。

答案 1 :(得分:3)

我高估了android:stackFromBottom的力量。它基本上做的是类似于“gravity:bottom”。它不会以相反的顺序添加项目,但它只是使内容与列表视图的底部对齐。

我仍在寻找反向适配器解决方案。

答案 2 :(得分:0)

也许您应该将其与AbsListView.setTranscriptMode(int)一起使用我有一个聊天应用程序,我提供两种显示对话的模式 - 使用AbsListView.setStackFromBottom(boolean)来自底部或顶部

答案 3 :(得分:0)

 LinearLayoutManager mLinearLayoutManager = new LinearLayoutManager(Application.get());
            mLinearLayoutManager.setStackFromEnd(true);
            mLinearLayoutManager.setReverseLayout(true);
list.setLayoutManager(mLinearLayoutManager);

试试这个希望这会对你有帮助。

答案 4 :(得分:0)

我建议使用比较器根据您想要的订单日期返回对象。这样做将确保数据始终按您想要的顺序而不是服务器发送的顺序。您可以查看如何使用排序here