Обновление расширяемого ListView после сортировки элементов - PullRequest
1 голос
/ 14 февраля 2012

Обзор:

  • У меня есть расширяемый список, в котором отображаются элементы типа ToDoElement.
  • Каждый элемент ToDoElement имеет одну строкудля элемента группы и 1-3 строки для дочерних элементов
  • Мой пользовательский адаптер списка expListAdapter получает информацию о групповых и дочерних элементах с помощью методов createGroupList() и createChildList().
  • В методе createChildList() я проверяю, сколько строк для дочерних элементов содержится в ToDoElement, и создаю дочерние элементы для адаптера.
  • В конце я могу отсортироватьМой список, сравнивая строки для групповых элементов.

Все это прекрасно работает, но вот моя Проблема:

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

My Предложение:

Я знаю, что каким-то образом методы createGroupList() и createChildList() должны вызываться снова из моего адаптера, но я не знаю, как это сделать.
Я пытался expListAdapter.notifyDataSetInvalidated(), потому что кто-то сказал мне, что этот метод будет вызывать createGroupList() и createChildList() снова, но это не работает.

Фрагменты кода:

Определение моего адаптера списка:

expListAdapter = new MyListAdapter(this, createGroupList(), createGroupList());
setListAdapter( expListAdapter );

createGroupList () и createChildList ():

    private List createGroupList() {    
      ArrayList result = new ArrayList();
      for (int i=0; i < Liste.AnzahlElemente(); i++) {    //
        result.add(Liste.getSize(i).getGroupString());
      }
      return result;
    }

    private List createChildList() {
        ArrayList result = new ArrayList();
        for(int i=0; i < Liste.getSize(); i++) {
            ArrayList secList = new ArrayList();
            for( int n = 1 ; n <= 3 ; n++ ) {
                if (Liste.getElement(i).getChildString(n).length() != 0){
                    secList.add( "- " + Liste.getElement(i).getChildString(n));
                }
            }
            result.add( secList );
        }
        return result;
}

Сортировка списка:
(ListeToDoListe объект, который управляет ToDoElement s в списке массивов

Collections.sort(Liste.getListe(), new NameComparator());

expListAdapter.notifyDataSetInvalidated();

//expListAdapter.notifyDataSetChanged(); //same effect as notifyDataSetInvalided

my NameComparator:

public class NameComparator implements Comparator<ToDoElement>{

     public int compare(ToDoElement item1, ToDoElement item2) {
           return item1.getGroupString().compareTo(item2.getGroupString());
     }
}


Большое спасибо за вашу помощь!!

Ответы [ 2 ]

2 голосов
/ 15 февраля 2012

Я решил свою собственную проблему!

Я написал метод обновления для моего пользовательского адаптера списка.

Он выглядит так:

public class MyListAdapter extends BaseExpandableListAdapter{

     private ArrayList<String> ueberschriften;
     private ArrayList<ArrayList<String>> stichpunkte;

     public MyListAdapter(Context context, List _ueberschriften, List _stichpunkte) { 

          this.ueberschriften = (ArrayList)_ueberschriften;
          this.stichpunkte = (ArrayList)_stichpunkte;

          inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

     // [...] some other methods

     public void update(List _GroupStrings, List _ChildStrings) {
          GroupStrings = (ArrayList<String>) _GroupStrings;
          ChildStrings = (ArrayList<ArrayList<String>>) _ChildStrings;
     }
}

Сортировка спискав моей деятельности выглядит так:

Collections.sort(Liste.getListe(), new NameComparator());

expListAdapter.update(createGroupList(), createChildList());

expListAdapter.notifyDataSetChanged();


теперь количество дочерних элементов также корректно обновляется!
ура!

0 голосов
/ 14 февраля 2012

Список в вашем адаптере и отображаемый список являются отдельными списками.

В случае, если адаптер заполнен новыми данными или данные переупорядочиваются, вам необходимо сообщить представлению с помощью notifyDataSetChanged () - это вызовет перерисовку представления.

notifyDataSetInvalidate () следует вызывать только в том случае, если ваши данные больше не доступны.

Как описано здесь: Адаптер ListView для Android notifyDataSetInvalidated () против notifyDataSetChanged ()

...