2013-04-28 40 views
3

我正在爲一個Android文件視圖應用程序維護代碼,並且在稍作修改後,我遇到了一個非常奇怪的情況。setSelectionFromTop有時不起作用

此應用程序支持在ListView中查看文件系統,並且每次用戶瀏覽不同的目錄時都會重新調用此ListView。在進入子目錄之前,當前的ListView位置將被存儲在堆棧中,並且在用戶從子目錄返回後,位置信息將從堆棧彈出,從而可以恢復之前的位置。

讓我告訴你它執行原來的步驟,用戶從一個子DIR到其父導航回來後,它使用的AsyncTask以藉此在刷新:

  1. 在onPreExecute

    ()方法,當前文件列表 - mFileNameList - 將被清空,並執行notifyDataSetChanged()操作。

  2. 在doInBackground()方法中,父文件夾中的文件列表將被收集並放入列表中。在進行子文件夾操作之前,setSelectionFromTop()會將ListView放入前一個位置。在onPostExecute()方法中,將收集的列表放入mFileNameList中,並且在notifyDataSetChanged()調用之後,setSelectionFromTop

這樣的機制在我維護源代碼之前工作得很好。但是在這個過程中我發現了一個小缺點:在onPreExecute()中,列表將被清空,所以在顯示文件列表之前ListView將會是空白的。

我以爲這樣的代碼是沒有必要的,所以我刪除了第一步。但是經過測試,我發現setSelectionFromTop()將不再定位ListView。每當用戶從子目錄返回時,ListView將始終顯示位置0的列表,而不是前一個位置。

這是顯示文件列表並恢復原始位置的代碼片段,但mFileListView.setSelectionFromTop(item.pos,item.top)不再有效。

@Override 
protected void onPostExecute(ArrayList<FileInfo> result) { 
    mFileNameList.clear(); 
    mFileNameList.addAll(result); 
    sortCurrentList(sort); 

    // other code 

    PathSelectionItem item = mFileViewInteractionHub.getLastPathListSelectionItem(); 
    if (item != null && item.path.equals(
     mFileViewInteractionHub.getCurrentPath())) { 
     mFileListView.setSelectionFromTop(item.pos, item.top); 
    } 

我記錄了後端堆棧,發現堆棧中沒有錯誤。實際上,我可以在調用setSelectionFromTop()之前設置Adapter(),它將修復該錯誤。但我不知道爲什麼setAdapter會做到這一點。

有沒有人可以告訴我發生了什麼?謝謝。

回答

0

setSelectionFromTop(int, int)在沒有設置適配器的情況下無法正常工作。通過查看源代碼,您可以確認。該方法的開始讀取如下(API level 19):

public void setSelectionFromTop(int position, int y) { 
    if (mAdapter == null) { 
    return; 
    } 

    // [...] 
} 

它沒有返回,如果沒有適配器設置做任何事情。