如何在CustomAdapter上使用notifyDataSetChanged?

时间:2014-08-23 20:28:44

标签: java android expandablelistview notifydatasetchanged

在我的Android应用程序中,我有一个ExpandableListView和BaseExpandableListAdapter,BaseExpandableListAdapter在一个单独的类中。在列表中,我在列表的子行中有一个删除按钮,该按钮删除当前行,但列表保持不变,而不是实时显示。我通过我的DbHandler将数据传输到适配器到HashMap。我尝试使用notifyDataSetChanged(),但没有结果,我再次运行onCreate。 我该如何解决?

2 个答案:

答案 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`由于更改了底层数据而重建了它的所有项目。

基本上,你通常做的是:

  • 从布局中查找ListView
  • 创建适配器实例
  • 连接ListView和适配器
  • 在适配器中设置一些数据
  • 调用notifyDataSetChanged()告诉ListView构建它的项目(通过调用适配器getCount()getView()等等。

如果稍后更改了底层数据(如在您的情况下通过“删除”按钮),则从适配器中的数据中删除该项,但列表视图在您通知ListView有关之前不会知道它。通过调用notifyDataSetChangedd()来更改数据。