2013-06-23 2 views
1

Вот мой код для просмотра всех папок в устройстве.Проблема с адаптером ListView в android

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 не получил уведомления. Убедитесь, что содержимое адаптера не изменено из фонового потока, но только из потока пользовательского интерфейса. [в ListView (2131034114, класс android.widget.ListView) с адаптером (класс android.widget.ArrayAdapter)]

Где я использую потоки? Почему это принудительное закрытие при нажатии любой пустой папки? Пожалуйста, помогите мне.

ответ

3

Я считаю, что проблема в том, что в обработчике onClick вы всегда очищаете() список, но только уведомляете адаптер, если выбранный каталог не пуст.

Таким образом, при нажатии пустой директории список изменяется (очищается), но адаптер не уведомляется.

Поэтому сообщение об ошибке «Содержимое адаптера изменилось, но ListView не получил уведомление».

Игнорируйте материал о потоках - это всего лишь ошибка автора сообщения об ошибке, а не окончательное указание на то, что вы изменили интерфейс пользователя из фонового потока.

+0

Блестящий. Вы решили мою проблему. Большое спасибо. – Santhosh

+0

Не мог бы проверить мой код, как если бы не этот ответ. Желаю, чтобы я мог +1 его 100 раз! – Sufian