【问题标题】:Listview position is incorrectly restored after that fragment destroyed该片段销毁后,Listview 位置错误恢复
【发布时间】:2013-07-12 11:29:36
【问题描述】:

我使用viewpager,里面有几个片段,大部分片段都由一个列表视图组成。我要检查其中之一。我尝试使用某些人建议的方法来解决无休止的滚动(因为我从外部数据库加载数据):

    if(position==getCount()-1){
        LoadMore(); 
    } 

所以每次用户向下滚动到最后一个项目时,它都会向列表视图添加更多项目。假设我滑开,那个片段被破坏了。然后过了一会儿我回去了,现在会发生什么?该片段已销毁,因此OnCreateView() 方法再次运行,现在仅在列表视图中加载了原始数量的项目(10)。但是列表视图的位置不知何故在最后(在 10 处),现在我所做的任何事情(再次向上和向下滚动)LoadMore() 函数都不会运行。 listview.getCount() 又是 10,所以应该没有问题。为什么会这样?还有为什么上面的代码在往回刷之后就再也没有运行了?

谢谢!

【问题讨论】:

  • 你在使用 fragmentpageradapter 吗?
  • 我使用 FragmentStatePagerAdapter
  • 保存状态只不过是在您的情况下保存列表视图中的项目数。默认情况下,android在内存中只保留左一页和右一页。其他页面将被销毁,当您滑回被销毁的页面时,将调用 onCreateView 并重新创建片段。因此,您必须保存状态
  • 好的,我阅读了有关 fragmentpageradapters 的信息,所以我真的必须保存状态,您的链接对我理解保存状态的行为有很大帮助。我以另一种方式使用片段,所以我将在另一个问题中问它。

标签: android listview android-viewpager fragment


【解决方案1】:

因为列表索引为 0,您不应该检查:

if(position==getCount()-1){ //check for the last item ?
    LoadMore(); 
} 

【讨论】:

  • 我实际上使用-3,因为我想在用户接近尾声时加载那些新的数据,而不是他在最后时。我将在我的问题中重写它。
  • 我想您正在适配器的 getView 方法中进行此检查。那么你能记录下它是否真的被调用并打印出 position 和 getCount() 的值吗?
  • 是的,我正在 getView 中执行此操作。我在 LoadMore() 之后放了一个日志,它被调用了,所以它应该向列表视图添加另外 10 个项目,因为日志告诉我 getcount 是 20。
  • 那你确定在加载完更多数据后调用 notifyDataSetChanged() 吗?
  • 哇,我放错地方了。谢谢,但我刚刚意识到保存状态会是一个更好的解决方案,我将在另一个问题中问它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 2017-03-06
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 2018-01-30
相关资源
最近更新 更多