в моем приложении для Android у меня есть ExpandableListView и BaseExpandableListAdapter, BaseExpandableListAdapter находится в отдельном классе. В списке у меня есть кнопка удаления внутри дочерней строки списка. Кнопка удаляет текущую строку, но список остается прежним и не показывает его в режиме реального времени. Я получаю данные адаптеру через свой DbHandler в HashMap. Я пытался использовать notifyDataSetChanged(), но безрезультатно, иначе я снова запускаю onCreate. Как я могу это решить?
Как использовать notifyDataSetChanged в CustomAdapter?
Ответы (2)
Допустим, вы инициализировали свой ExpandableListView с двумя списками ArrayList: первый содержит группы, а второй — дочерние элементы для этих групп. Это будет выглядеть так:
private ArrayList<E> mListGroups;
private ArrayList<ArrayList<E>> mGroupsItems;
Ниже приведен пример расширения пользовательского макета для дочерних элементов только с одним TextView в нем.
@Override
public View getChildView(final int groupPosition, final int childPosition, boolean isLastChild,
View convertView, ViewGroup parent) {
ItemViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item_drawer, null);
holder = new ItemViewHolder();
holder.tv = (TextView)convertView.findViewById(R.id.text1);
convertView.setTag(holder);
} else holder = (ItemViewHolder)convertView.getTag();
holder.tv.setText(getChild(groupPosition, childPosition).getName());
holder.tv.setClickable(true);
holder.tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mGroupsItems.get(groupPosition).remove(childPosition);
notifyDataSetChanged();
}
});
return convertView;
}
Чтобы удалить щелкнутый элемент, вы устанавливаете OnClickListener в этом представлении и удаляете элемент из списка. В вашей реализации вы установите OnClickListener для ImageView. Вот и все.
А, еще кое-что. Приведенная выше реализация обновляет только отображаемый список. Список останется неизменным в вашей деятельности. Итак, если вы повернете экран, например, все удаленные элементы появятся снова. Я также реализовал интерфейс и передал обновленный список обратно в свою активность из адаптера в обратном вызове.
notifyDataSetChanged
сообщает ListView`у перестроить все его элементы из-за изменений в базовых данных.
Итак, в основном, что вы обычно делаете, это:
- Найти ListView из макета
- Создать экземпляр адаптера
- Подключить ListView и адаптер
- Установите некоторые данные в адаптере
- Вызовите notifyDataSetChanged(), чтобы сообщить ListView о создании своих элементов (путем вызова адаптера
getCount()
,getView()
и т. д.
Когда базовые данные изменяются позже (как в вашем случае с помощью кнопки «Удалить»), вы удаляете этот элемент из данных в адаптере, но список не узнает об этом, пока вы не уведомите ListView об измененных данных через вызов до notifyDataSetChangedd()
.