1

我正在使用ListFragment带有自定义适配器的 a,它用于扩展视图。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 完成更新其内容时,是否有函数/回调让我收到通知?或者在内容加载后如何将视图滚动到某个位置?

4

2 回答 2

1

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

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

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

于 2013-06-24T07:38:16.223 回答
1

在创建 listfragment 活动时,为 listview 设置转录模式和 stackfromBottom。现在每次更新列表视图时,它都会滚动到最新项目的底部。

public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
            getListView().setStackFromBottom(true);
}
于 2015-05-11T14:35:25.390 回答