4

我有一个自定义的 ArrayAdapter。当数据显示在 ListViews 中时,我总是希望它排序,因此我尝试覆盖 notifyDataSetChanged() 以首先对适配器进行排序,如下所示:

@Override
public void notifyDataSetChanged() {
    sort(new Comparator<IceContact>() {
        @Override
        public int compare(IceContact iceContact, IceContact iceContact2) {
            return iceContact.compareTo(iceContact2);
        }
    });
    super.notifyDataSetChanged();
}

IceContact 类是一个实现 Comparable 的 get-set 类。不幸的是,这给了我一个具有讽刺意味的 StackOverflowError (下面的 logcat)。然后我试着反过来做。之后直接覆盖sort()并调用notifyDataSetChanged(),如下所示:

@Override
public void sort(Comparator<? super IceContact> comparator) {
    super.sort(comparator);
    notifyDataSetChanged();
}

这很好用!谁能解释为什么?感觉它们几乎是相同的实现。


01-21 18:25:50.725: ERROR/AndroidRuntime(2490): FATAL EXCEPTION: main
    java.lang.StackOverflowError
    at android.view.View.setFocusableInTouchMode(View.java:5584)
    at android.widget.AdapterView.checkFocus(AdapterView.java:717)
    at android.widget.AdapterView$AdapterDataSetObserver.onChanged(AdapterView.java:812)
    at android.widget.AbsListView$AdapterDataSetObserver.onChanged(AbsListView.java:6044)
    at android.database.DataSetObservable.notifyChanged(DataSetObservable.java:37)
    at android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50)
    at android.widget.ArrayAdapter.notifyDataSetChanged(ArrayAdapter.java:286)
    at se.naxiait.curbits.utils.IceContactAdapter.notifyDataSetChanged(IceContactAdapter.java:70)
    at android.widget.ArrayAdapter.sort(ArrayAdapter.java:278)
    at se.naxiait.curbits.utils.IceContactAdapter.notifyDataSetChanged(IceContactAdapter.java:71)
    at android.widget.ArrayAdapter.sort(ArrayAdapter.java:278)
    at se.naxiait.curbits.utils.IceContactAdapter.notifyDataSetChanged(IceContactAdapter.java:71)
    at android.widget.ArrayAdapter.sort(ArrayAdapter.java:278)
    at se.naxiait.curbits.utils.IceContactAdapter.notifyDataSetChanged(IceContactAdapter.java:71)
    at android.widget.ArrayAdapter.sort(ArrayAdapter.java:278)
    at se.naxiait.curbits.utils.IceContactAdapter.notifyDataSetChanged(IceContactAdapter.java:71)
    at android.widget.ArrayAdapter.sort(ArrayAdapter.java:278)
    at se.naxiait.curbits.utils.IceContactAdapter.notifyDataSetChanged(IceContactAdapter.java:71)
    at android.widget.ArrayAdapter.sort(ArrayAdapter.java:278)
    at se.naxiait.curbits.utils.IceContactAdapter.notifyDataSetChanged(IceContactAdapter.java:71)
    at android.widget.ArrayAdapter.sort(ArrayAdapter.java:278)
    at se.naxiait.curbits.utils.IceContactAdapter.notifyDataSetChanged(IceContactAdapter.java:71)
    at android.widget.ArrayAdapter.sort(ArrayAdapter.java:278)
    at se.naxiait.curbits.utils.IceContactAdapter.notifyDataSetChanged(IceContactAdapter.java:71)
    at android.widget.ArrayAdapter.sort(ArrayAdapter.java:278)
    at se.naxiait.curbits.utils.IceContactAdapter.notifyDataSetChanged(IceContactAdapter.java:71)
    at android.widget.ArrayAdapter.sort(ArrayAdapter.java:278)
    at se.naxiait.curbits.utils.IceContactAdapter.notifyDataSetChanged(IceContactAdapter.java:71)
    at android.widget.ArrayAdapter.sort(ArrayAdapter.java:278)
    at se.naxiait.curbits.utils.IceContactAdapter.notifyDataSetChanged(IceContactAdapter.java:71)
    at android.widget.ArrayAdapter.sort(ArrayAdapter.java:278)
    at se.naxiait.curbits.utils.IceContactAdapter.notifyDataSetChanged(IceContactAdapter.java:71)
    at android.widget.ArrayAdapter.sort(ArrayAdapter.java:278)
    at se.naxiait.curbits.utils.IceContactAdapter.notifyDataSetChanged(IceContactAdapter.java:71)
    at android.widget.ArrayAdapter.sort(ArrayAdapter.java:278)
    at se.naxiait.curbits.utils.IceContactAdapter.notifyDataSetChanged(IceContactAdapter.java:71)
    at android.widget.ArrayAdapter.sort(ArrayAdapter.java:278)
    at se.naxiait.curbits.utils.IceContactAdapter.notifyDataSetChanged(IceContactAdapter.java:71)
    at android.widget.ArrayAdapter.sort(ArrayAdapter.java:278)
    at se.naxiait.curbits.utils.IceContactAdapter.notifyDataSetChanged(IceContactAdapter.java:71)
    at android.widget.ArrayAdapter.sort(ArrayAdapter.java:278)
    at se.naxiait.curbits.utils.IceContactAdapter.notifyDataSetChanged(IceContactAdapter.java:71)
    at android.widget.ArrayAdapter.sort(ArrayAdapter.java:278)
    at se.naxiait.curbits.utils.IceContactAdapter.notifyDataSetChanged(IceContactAdapter.java:71)
    at android.widget.ArrayAdapter.sort(ArrayAdapter.java:278)
    at se.naxiait.curbits.utils.IceContactAdapter.notifyDataSetChanged(IceContactAdapter.java:71)
    at android.widget.ArrayAdapter.sort(ArrayAdapter.java:278)
    at se.naxiait.curbits.utils.IceContactAdapter.notifyDataSetChanged(IceContactAdapter.java:71)
    at android.widget.ArrayAdapter.sort(ArrayAdapter.java:278)
    at se.naxiait.curbits.utils.IceContactAdapter.notifyDataSetChanged(IceContactAdapter.java:71)
    at android.widget.ArrayAdapter.sort(ArrayAdapter.java:278)
    at se.naxiait.curbits.utils.IceContactAdapter.notifyDataSetChanged(Ic
4

3 回答 3

5

IceContact 类是一个实现 Comparable 的 get-set 类。不幸的是,这给了我一个具有讽刺意味的 StackOverflowError (下面的 logcat)。

sort()调用是默认的(在其实现中)notifyDataSetChanged(),然后将再次调用,然后再sort()调用notifyDataSetChanged()哪个将调用sort()哪个将调用...

notifyDataSetChanged对数据进行排序时,无需调用notifyDataSetChanged()assort()将自动为您执行此操作。

第二种情况将起作用,因为您基本上会调用notifyDataSetChanged()两次(super.sort()对数据进行排序->notifyDataSetChanged()super调用->notifyDataSetChanged()由您调用)

于 2013-01-21T17:48:12.527 回答
0

您可以使用registerAdapterDataObserver

 adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
        @Override
        public void onChanged() {
            super.onChanged();
            //your code;
        }
    });
于 2019-07-31T09:15:25.367 回答
-1

防止异常的一种简单方法是禁用对 notifyDataSetChanged() 的调用。

@Override
public void notifyDataSetChanged() 
{
    setNotifyOnChange(false);
    sort(yourComparatorInstance);
    super.notifyDataSetChanged();
}

它将根据文档自动重新启用:

...并调用 notifyDataSetChanged() 将标志重置为真。

这就是 sort() 的作用。

于 2013-07-29T15:14:40.997 回答