gpt4 book ai didi

android - setSelectionFromTop 有时不起作用

转载 作者:太空狗 更新时间:2023-10-29 15:11:07 27 4
gpt4 key购买 nike

我正在维护一个Android文件查看应用程序的代码,经过一个小的修改,我遇到了一个很奇怪的情况。

此应用支持在 ListView 中查看文件系统,每次用户浏览不同目录时都会重新显示此 ListView。在进入子目录前,ListView的当前位置会存入一个栈中,当用户从子目录返回后,位置信息会从栈中弹出,从而可以恢复到之前的位置。

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

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

  2. 在doInBackground()方法中,将父文件夹中的文件列表收集起来,放在一个列表中。

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

在我维护源代码之前,这种机制运行良好。但是我在这个过程中发现了一个小缺点:在onPreExecute()中,列表会被清空,所以ListView在显示文件列表之前是空白的。

我认为这样的代码是不必要的,所以我删除了第一步。但是经过测试,我发现setSelectionFromTop()不会再对ListView进行定位了。每次用户从子目录返回时,ListView 总是从位置 0 开始显示列表,而不是从之前的位置开始。

这是显示文件列表并恢复原始位置的代码 fragment ,但 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 会成功。

有没有人能告诉我发生了什么事?谢谢。

最佳答案

setSelectionFromTop(int, int) 在未设置适配器的情况下不起作用。通过查看源代码,您可以确认这一点。该方法的开头如下所示(API 级别 19):

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

// [...]
}

如果没有设置适配器,它什么都不做就返回。

关于android - setSelectionFromTop 有时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16260314/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com