2016-09-05 4 views
0

У меня возникла проблема с расширением listview, я применил для него простой адаптер BaseExpandableListAdapter, как говорят многие онлайн-руководства.Заполнение динамически расширяемого списка, после расширения группы

Когда я заполняю группы expandablelistview и дочерние элементы одновременно, в начале фрагмента у меня нет проблем, но когда я пытаюсь заполнять дочерние элементы при их расширении (внутри onGroupClick), я получаю исключение NullPointerException при эта точка реализации адаптера:

public int getChildrenCount(int groupPosition) { 
    return namesCollections.get(contactNames.get(groupPosition)).size(); 
} 

I другие слова namesCollections которые я инициализировать в конструкторе адаптера (ниже), по всей видимости, будет нулевым:

public FavoriteAdapter(Activity context, List<String> contactNames, 
         Map<String, List<String>> namesCollections) { 
    this.context = context; 
    this.namesCollections = namesCollections; 
    this.contactNames = contactNames; 
} 

Как я могу заполнить Чайлдс по расширению из группы?

+0

Вы говорите, что у вас есть группа с детьми, но вы пытаетесь добавить данные поддержки для детей динамически после щелчка группы? – NameSpace

+0

Да, добавьте данные поддержки после щелчка группы, правильно! –

+0

Я хочу показать все контакты в группах, но добавлять детали только после их расширения. –

ответ

0

Если вы пытаетесь добавить данные резервного копирования после щелчка, это означает, что эта коллекция, которую вы пытаетесь получить, равна либо нулевой, либо нулевой. Большинство likley null, так как именно здесь вы получаете свой нулевой указатель. Вы не можете позвонить .size() по нулевой ссылке.

public int getChildrenCount(int groupPosition) { 
    return namesCollections.get(contactNames.get(groupPosition)).size(); 
} 

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

Также вы должны позвонить notifyDataSetHasChanged(), когда вы добавите данные своей базы данных, чтобы просмотреть их.

Вопрос об исполнении: ExpandableListView не создает представления для детей (и, таким образом, не запрашивает данные для них - то есть метод getChildView() не вызывается) до тех пор, пока группа ребенка не будет расширена, а список будет прокручиваться так что ребенок будет отображаться на экране. Теперь вам все равно придется заплатить штраф за выполнение полного набора резервных данных, если вы извлечете все данные в начале, а не динамически. Таким образом, есть причина для получения данных динамически, но ELV не тратит время на запросы на поддержку данных резервного копирования или создание представлений для детей, которые он пока не должен отображать.

+0

Не очень проблематично, мне нужно показать все contatcs (скажем, более 400), если я заполню все contatcs всеми подробностями (мобильный, домашний, электронный), приложение, вероятно, замедлит работу. –

+0

Хорошо, это ответ на мой вопрос, спасибо большое. Я также попытаюсь извлечь данные динамически. –