1

デバイス内のすべてのフォルダーを参照するコードを次に示します。

private File file;
private List<String> directoriesList;
private ListView listView ;
private ArrayAdapter<String> adapter;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.folder_browse_screen);
    listView = (ListView) findViewById(R.id.foldersListView);

    directoriesList = new ArrayList<String>();

    file = new File("/mnt");

     File list[] = file.listFiles();
    if (list != null && list.length >= 1) {
        for (int i = 0; i < list.length; i++) {
            File f = list[i];
            if (!f.isHidden() && f.canRead() && f.isDirectory()) {
                directoriesList.add(f.getName());
            }
        }

        adapter  = new ArrayAdapter<String>(this, R.layout.list_row, R.id.folder_name, directoriesList);
        listView.setAdapter(adapter);
}

OnItemClick :

@Override  
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {  
    try {
        File temp_file = new File(file, directoriesList.get(position));

        if (!temp_file.isHidden() && temp_file.canRead() && temp_file.isDirectory()) {
            file = new File(file, directoriesList.get(position));
            File list[] = file.listFiles();
            directoriesList.clear();

            if (list != null && list.length >= 1) {  
                for (int i = 0; i < list.length; i++) {
                    File f = list[i];
                    if (!f.isHidden() && f.canRead() && f.isDirectory()) {
                        directoriesList.add(f.getName());
                    }
                } 
                adapter.notifyDataSetChanged(); 
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

例外: java.lang.IllegalStateException: アダプターの内容が変更されましたが、ListView は通知を受け取りませんでした。アダプターのコンテンツがバックグラウンド スレッドからではなく、UI スレッドからのみ変更されていることを確認してください。[ListView(2131034114、class android.widget.ListView) with Adapter(class android.widget.ArrayAdapter)]

どこでスレッドを使用していますか? 空のフォルダをクリックすると強制的に閉じるのはなぜですか? 私を助けてください。

4

1 に答える 1

3

問題は、onClick ハンドラーで常にリストを clear() するが、選択したディレクトリが空でない場合にのみアダプターに通知することだと思います。

そのため、空のディレクトリをクリックすると、リストが変更 (クリア) されますが、アダプターには通知されません。

そのため、「アダプターの内容が変更されましたが、ListView は通知を受け取りませんでした」というエラー メッセージが表示されます。

スレッドに関することは無視してください。これは、エラー メッセージの作成者による単なる推測であり、バックグラウンド スレッドから UI を変更したことを明確に示すものではありません。

于 2013-06-23T03:25:22.130 に答える