我正在使用带有自定义适配器的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完成内容更新时,我会收到通知?或者在内容加载后如何将视图滚动到某个位置?
答案 0 :(得分:1)
感谢pskink评论,我再次尝试了,并注意到setSelection()
中没有发生异常,而是getListView()
中的异常 - 我虽然我的加载器会在创建视图后重新加载数据,但相反它使用了缓存的结果,因此在片段视图的初始化完成之前实际调用了onLoadFinished()
,从而导致异常。
正确的方法是确定onLoadFinished()
中的位置,然后覆盖片段onViewCreated()
并在那里执行getListView().setSelection(curPosition)
。
可能还有加载器清除其缓存并且必须在考虑onLoadFinished()
方法后调用onViewCreated()
的情况,但到目前为止它工作正常。