我正在为Android文件视图应用程序保留代码,经过一些小修改后,我遇到了一个非常奇怪的情况。
此应用程序支持在ListView中查看文件系统,每次用户浏览不同的目录时,都会重新启动此ListView。在进入子目录之前,当前ListView位置将存储在堆栈中,并且在用户从子目录返回后,位置信息将从堆栈中弹出,因此可以恢复先前的位置。
让我向您展示在用户从子目录导航回其父目录后执行的原始步骤,它使用AsyncTask来刷新:
在onPreExecute()方法中,将清空当前文件列表 - mFileNameList - 并执行notifyDataSetChanged()操作。
在doInBackground()方法中,将收集父文件夹中的文件列表,并将其放入列表中。
在onPostExecute()方法中,收集的列表放在mFileNameList中,在notifyDataSetChanged()调用之后,setSelectionFromTop()会在进入子文件夹之前将ListView放在上一个位置。
在维护源代码之前,这种机制很有效。但是我在这个过程中发现了一个小缺点:在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(),它将修复bug。但我不知道为什么setAdapter会做到这一点。
有人能告诉我发生了什么吗?感谢。
答案 0 :(得分:0)
setSelectionFromTop(int, int)
不起作用。通过查看源代码,您可以确认。该方法的开头如下(API level 19
):
public void setSelectionFromTop(int position, int y) {
if (mAdapter == null) {
return;
}
// [...]
}
如果没有设置适配器,它将返回而不执行任何操作。