13

我有一个关于我的 Android 应用程序的小问题。我搜索了很长时间,但没有发现我的问题。

场景:我必须显示一个还原列表视图(作为 Facebook Messenger)。当用户滚动到顶部时,加载更多消息。

问题notifiyDataAsChanged()调用后,滚动不一样!我想保留与加载前完全相同的位置。

我试过那个代码:

// save index and top position
int index = list.getFirstVisiblePosition()+result.size();
View v = list.getChildAt(index);
int top = (v == null) ? 0 : v.getTop();

// ...
// restore
list.setSelectionFromTop(index, top);

但是加载后的滚动并不完全相同。

你有想法吗?

4

4 回答 4

40

我认为您应该考虑将TranscriptModeStackFromBottom与您的列表视图一起使用:

android:stackFromBottom="true"
android:transcriptMode="normal"

通过将转录模式设置为正常,只有当最后一个项目已经在视图中时,它才会滚动到底部。这样,当您调用 notifydatasetchanged 时,您的用户可以不间断地查看以前的列表视图项。

于 2013-05-01T13:46:50.227 回答
6

这样做:

Collections.reverse(YourList); // ADD THIS LINE TO REVERSE ORDER!
YourList.notifyDataSetChanged;
于 2017-05-08T20:32:59.513 回答
3

我通过使用与您包含的相同代码来解决此问题,但我在恢复位置之前通过添加到适配器的项目数更新索引变量。似乎可以解决问题。

于 2014-05-06T23:43:22.710 回答
1

因为 Kotlin 更简单

 myList.reverse()
于 2020-04-23T18:23:03.507 回答