用于ExpandableListView的android notifyDataSetChanged不起作用

时间:2011-10-19 07:31:11

标签: android expandablelistview

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

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

mAdapter.notifyDataSetChanged();

但它不能按我的意愿工作。 为什么呢?

4 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:0)

您必须等到绘制整个viewtree,然后才能调用notifyDataSetChanged()

“视图树观察器用于注册可以通知视图树中全局变化的侦听器。这样的全局事件包括但不限于整个树的布局,绘图过程的开始,触摸模式更改.... 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();     
}}); 

答案 3 :(得分:0)

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

相反,Expandable RecyclerView提供了一组通知方法,能够通知适配器对ParentListItem列表的更改。

// 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/