setSelectionFromTop有时不起作用

时间:2013-04-28 06:37:01

标签: android listview android-listview

我正在为Android文件视图应用程序保留代码,经过一些小修改后,我遇到了一个非常奇怪的情况。

此应用程序支持在ListView中查看文件系统,每次用户浏览不同的目录时,都会重新启动此ListView。在进入子目录之前,当前ListView位置将存储在堆栈中,并且在用户从子目录返回后,位置信息将从堆栈中弹出,因此可以恢复先前的位置。

让我向您展示在用户从子目录导航回其父目录后执行的原始步骤,它使用AsyncTask来刷新:

  1. 在onPreExecute()方法中,将清空当前文件列表 - mFileNameList - 并执行notifyDataSetChanged()操作。

  2. 在doInBackground()方法中,将收集父文件夹中的文件列表,并将其放入列表中。

  3. 在onPostExecute()方法中,收集的列表放在mFileNameList中,在notifyDataSetChanged()调用之后,setSelectionFromTop()会在进入子文件夹之前将ListView放在上一个位置。

  4. 在维护源代码之前,这种机制很有效。但是我在这个过程中发现了一个小缺点:在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会做到这一点。

    有人能告诉我发生了什么吗?感谢。

1 个答案:

答案 0 :(得分:0)

如果没有设置适配器,

setSelectionFromTop(int, int)不起作用。通过查看源代码,您可以确认。该方法的开头如下(API level 19):

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

  // [...]
}

如果没有设置适配器,它将返回而不执行任何操作。