3

私は Android ファイル ビュー アプリのコードを維持しています。マイナーな変更を行った後、非常に奇妙な状況に遭遇しました。

このアプリは、ListView でのファイル システムの表示をサポートしており、この ListView は、ユーザーが別のディレクトリを移動するたびに再利用されます。サブディレクトリに入る前に、現在の ListView の位置がスタックに格納され、ユーザーがサブディレクトリから戻った後、位置情報がスタックからポップされるため、以前の位置を復元できます。

ユーザーがサブディレクトリからその親に戻った後に実行する元の手順を示しましょう。AsyncTask を使用して更新を実行します。

  1. onPreExecute() メソッドでは、現在のファイル リスト (mFileNameList) が空になり、notifyDataSetChanged() 操作が続きます。

  2. doInBackground() メソッドでは、親フォルダー内のファイル リストが収集され、リストに入れられます。

  3. 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() を呼び出す前に setAdapter() を実行すると、バグが修正されます。しかし、setAdapter がうまくいく理由がわかりません。

何が起こったのか教えてくれる人はいますか?ありがとう。

4

1 に答える 1