我正在爲一個Android文件視圖應用程序維護代碼,並且在稍作修改後,我遇到了一個非常奇怪的情況。setSelectionFromTop有時不起作用
此應用程序支持在ListView中查看文件系統,並且每次用戶瀏覽不同的目錄時都會重新調用此ListView。在進入子目錄之前,當前的ListView位置將被存儲在堆棧中,並且在用戶從子目錄返回後,位置信息將從堆棧彈出,從而可以恢復之前的位置。
讓我告訴你它執行原來的步驟,用戶從一個子DIR到其父導航回來後,它使用的AsyncTask以藉此在刷新:
- 在onPreExecute
()方法,當前文件列表 - mFileNameList - 將被清空,並執行notifyDataSetChanged()操作。
在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會做到這一點。
有沒有人可以告訴我發生了什麼?謝謝。