2011-08-28 14 views
10

在Honeycomb中,引入了Loader API作爲通過在後臺線程上執行繁重操作來嚮應用程序提供數據的正確方法。在我的應用程序中,我正在努力將所有Cursor s替換爲返回Cursor s的Loader s。由於Cursor.requery()現在已被折舊,因此建議您只需撥打restartLoader,並允許該工作在後臺線程中再次完成,然後在onLoadFinished中返回時返回changeCursor如何在使用新的Loader API時保持ListView位置?

所有這些奇妙地工作,除了當我想要重新查詢數據時,ListView不維護它的滾動位置,使用Cursor.requery()這用於工作,因爲它是具有更新數據的相同Cursor實例。

如何在不失去滾動位置的情況下刷新我的Loader?

+0

你可以使用'getScrollX你的滾動位置()'和'getScrollY()'在刷新之前緩存它,然後再次手動設置它。我不確定這是否會導致視覺閃爍或其他不愉快。 : - / –

回答

6

Loader類本身並不知道數據集何時更改,並且是當前特定於CursorLoader的實現。現在在我的應用程序中,我需要刷新的數據位於本地SQLite數據庫(無ContentProvider)中,因此我必須修改CursorLoader以使用本地數據庫,正如Dianne Hackborne在developer group中提到的那樣。

不幸的是剛剛返回從loadInBackground遊標不允許ContentObserver正確通知裝載機當數據的變化,這是因爲當requery()是呼籲光標AbstractCursor只要求notifyChanged()

由於ContentObserver永遠不會通知Loader數據已經改變,我最終根據需要自己調用Loader.onContentChanged()。在這一點上,它似乎一切正常,但如果有任何重大問題出現,我會更新此答案。

0

您必須在每個加載程序加載時不創建新的適配器;我的意思..

@Override 
    public void onLoadFinished(Loader<List<NotificationItem>> loader, List<NotificationItem> notifications) { 
     // We must do it in this way to not losing listview scroll position after a reload. 
     if(mAdapter==null) { 
      mAdapter = new HomeUserActivityListAdapter(getActivity(), notifications); 
      mListView.setAdapter(mAdapter); 

     }else{ 
      mAdapter.refill(notifications); 
     } 
    } 

而且在您適配器創建一個方法來補充項目

public void refill(List<NotificationItem> notifications) { 
    mNotificationsList.clear(); 
    mNotificationsList.addAll(notifications); 
    notifyDataSetChanged(); 
} 

而這一切,它將保持準確:-)

相關問題