Android - 适配器数据更改后,在ListFragment中滚动到ListView中的位置

时间:2013-06-23 06:01:43

标签: java android listview android-listview callback

我正在使用带有自定义适配器的ListFragment,该适配器用于扩充视图。创建片段后,数据将通过AsyncTaskLoader加载。

我现在的问题是我想滚动(不是平滑滚动)到某个位置来显示最后选择的元素,即当我选择一个元素时片段被破坏,我想在列表中显示相同的位置片段再次显示。

因此创建视图并且一切正常,但我不知道在哪里添加getListView().setSelection(x)行以滚动到某个位置。在Loader<?>.onLoadFinished()函数中清除并将元素添加到适配器后,我尝试调用它,但这不起作用,我得到以下例外:

java.lang.IllegalStateException: Content view not yet created
  at android.support.v4.app.ListFragment.ensureList(ListFragment.java:328)
  at android.support.v4.app.ListFragment.getListView(ListFragment.java:222)
  at fs.pokemon.effect.PokemonFragment.updateData(PokemonFragment.java:239)
  at fs.pokemon.effect.PokemonFragment$2.onLoadFinished(PokemonFragment.java:129)
  ...

我的问题是:是否有函数/回调,所以当ListView完成内容更新时,我会收到通知?或者在内容加载后如何将视图滚动到某个位置?

1 个答案:

答案 0 :(得分:1)

感谢pskink评论,我再次尝试了,并注意到setSelection()中没有发生异常,而是getListView()中的异常 - 我虽然我的加载器会在创建视图后重新加载数据,但相反它使用了缓存的结果,因此在片段视图的初始化完成之前实际调用了onLoadFinished(),从而导致异常。

正确的方法是确定onLoadFinished()中的位置,然后覆盖片段onViewCreated()并在那里执行getListView().setSelection(curPosition)

可能还有加载器清除其缓存并且必须在考虑onLoadFinished()方法后调用onViewCreated()的情况,但到目前为止它工作正常。