在我的Android应用程序中,我有一个ExpandableListView和BaseExpandableListAdapter,BaseExpandableListAdapter在一个单独的类中。在列表中,我在列表的子行中有一个删除按钮,该按钮删除当前行,但列表保持不变,而不是实时显示。我通过我的DbHandler将数据传输到适配器到HashMap。我尝试使用notifyDataSetChanged(),但没有结果,我再次运行onCreate。 我该如何解决?
答案 0 :(得分:0)
假设您已使用两个ArrayLists初始化了ExpandableListView:第一个包含Groups,第二个包含子组。它看起来像:
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并从列表中删除元素。在您的实现中,您将在ImageView上设置OnClickListener。那就是它。
啊,还有一件事。以上实现仅更新显示的列表。该列表将在您的活动中保持不变。因此,例如,如果您旋转屏幕,则会再次显示所有已删除的项目。我还实现了一个接口,并在回调中将更新的列表传递回适配器的Activity。答案 1 :(得分:0)
notifyDataSetChanged
告诉ListView`由于更改了底层数据而重建了它的所有项目。
基本上,你通常做的是:
getCount()
,getView()
等等。如果稍后更改了底层数据(如在您的情况下通过“删除”按钮),则从适配器中的数据中删除该项,但列表视图在您通知ListView有关之前不会知道它。通过调用notifyDataSetChangedd()
来更改数据。