2011-09-05 73 views
4

我有一个带有ListView的片段,我希望ListView在保存和恢复片段时保持其滚动位置。通常这很简单,只需在保存时调用ListView.getFirstVisiblePosition()并在恢复时调用ListView.setSelection()(ListView.setSelectionFromTop()(如果您想要)。滚动ListView到光标加载后的位置

但是,我正在使用加载程序,并且当活动启动时,我的ListView未完全填充。如果我在onActivityCreated()期间设置了Selection(),那么该列表将不会有任何内容滚动至此,并且该调用将被忽略。

我现在通过在将来某个时间发布滚动来解决这个问题,但是这绝对不是理想的。我更喜欢它在数据加载完成后向右滚动。我几乎在这里做,但swapCursor()不刷新,它只是为未来安排失效。

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    mAdapter.swapCursor(data); 
    if (savedScrollPosition != null) { 
     Log.d(TAG, "loaded and scrolling to " + savedScrollPosition); 
     new Handler().postDelayed(new Runnable(){ 
      @Override 
      public void run() { 
       list.setSelection(savedScrollPosition); 
       savedScrollPosition = null; 
      } 
     }, 100); 
    } 
} 

你知道任何滚动ListView的权利,因为ListView完成填充数据吗?

回答

7

试试这个:

listView.post(new Runnable() { 

     @Override 
     public void run() { 
      listView.setSelection(savedScrollPosition); 
      savedScrollPosition = null; 
     } 
    }); 
+0

工作就像一个魅力。谢谢! – num1

+0

很高兴为你效劳:) – Shafi

+0

你在哪里添加了这段代码?你能否再解释一下 - 我不确定我理解这里发生了什么。 – RightHandedMonkey