【问题标题】:android notifyDataSetChanged for ExpandableListView not workingExpandableListView的android notifyDataSetChanged不起作用
【发布时间】:2011-10-19 07:31:11
【问题描述】:

在我的应用程序中,我正在使用 ExpandableListView。我正在使用扩展 BaseExpandableListAdapter 的适配器。我要刷新ExpandableListView

我的ExpandableListView 包含与数据库链接的带有删除按钮的项目。 如果我按下删除按钮,该项目将从数据库中永久删除。但是listview 并没有同时刷新。如果我再次运行该活动,它会令人耳目一新,但不是同时进行。 我正在使用

mAdapter.notifyDataSetChanged();

但它没有按我的意愿工作。 为什么?

【问题讨论】:

  • 你是否也重新查询了Cursor..?
  • 因为我只删除了该项目,因为不需要该光标。所以我没有使用那个

标签: android expandablelistview


【解决方案1】:

我刚刚在 BaseExpandableListAdapter 的以下重写方法上调用了 super,从那时起 notifyDataSetChanged() 就可以工作了。

    @Override
    public void registerDataSetObserver(DataSetObserver observer) {
        super.registerDataSetObserver(observer);    
    }

【讨论】:

  • 不确定 ExpandableListAdapter 是一个接口。
  • 我觉得有点晚了,但实际上我使用了这个类:BaseExpandableListAdapter 作为列表适配器..
  • 嗯,这很有道理,感谢您更新答案。
  • 所以,你一定是重写了那个方法而不是调用 super.以前?
  • 我也不记得重写该方法,但看起来 Android Studio 为我实现了它,但由于某种原因没有添加 super。感谢您指出这一点 - 我在这个问题上停留了一段时间:)
【解决方案2】:

您可以尝试在刷新时在 ExpandableListView 上额外调用 invalidateViews()。

【讨论】:

  • 我会在哪里写呢? bcz 我想在删除按钮上单击刷新应该发生。
  • 每当您的 ExpandableListView 的内容发生更改时。所以在你删除了一些条目之后,例如
  • 但是 invalidateViews() 不可用
  • 此方法必须在 ExpandableListView 对象上调用,而不是在您的适配器上。根据android java doc ExpandableListView从超类AbsListView继承了这个方法:developer.android.com/reference/android/widget/…
  • 是的,我只使用该对象,但它不可用
【解决方案3】:

你必须等到整个视图树被绘制出来,然后你才能调用 notifyDataSetChanged()

“视图树观察者用于注册监听器,可以通知视图树的全局变化。这样的全局事件包括但不限于,整个树的布局,绘图通道的开始, touch mode change.... ViewTreeObserver 不应该被应用程序实例化,因为它是由视图层次结构提供的。有关详细信息,请参阅 getViewTreeObserver()。"

http://developer.android.com/reference/android/view/ViewTreeObserver.html

 final View v = convertView;
        ViewTreeObserver vto = convertView.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
            public void onGlobalLayout() {
                v.getViewTreeObserver().removeOnGlobalLayoutListener(this);

                notifyDataSetChanged();     
}}); 

【讨论】:

    【解决方案4】:

    如果您使用 Big Nerd Ranch 的可扩展列表,请注意传统的 notifyDataSetChanged()RecyclerView.adapter 不起作用。

    而 Expandable RecyclerView 提供了一组通知方法,能够通知适配器 ParentListItems 列表的更改。

    // Parent Changes
    notifyParentItemInserted(int parentPosition)
    notifyParentItemRemoved(int parentPosition)
    notifyParentItemChanged(int parentPosition)
    notifyParentItemRangeInserted(int parentPositionStart, int itemCount)
    
    // Child Changes
    notifyChildItemInserted(int parentPosition, int childPosition)
    notifyChildItemRemoved(int parentPosition, int childPosition)
    notifyChildItemChanged(int parentPosition, int childPosition)
    

    更多详情请访问https://bignerdranch.github.io/expandable-recycler-view/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多