覆盖notifyDataSetChanged()

Nik*_*man 3 android android-arrayadapter

我有一个自定义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();
}
Run Code Online (Sandbox Code Playgroud)

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

@Override
public void sort(Comparator<? super IceContact> comparator) {
    super.sort(comparator);
    notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)

这很好用!有谁能解释为什么?感觉它们几乎完全相同.


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
Run Code Online (Sandbox Code Playgroud)

Luk*_*rog 5

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

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

notifyDataSetChanged排序的数据还呼吁notifyDataSetChanged()sort()会自动为你做的.

第二种情况将起作用,因为你基本上会调用notifyDataSetChanged()两次(super.sort()对你调用data-> notifyDataSetChanged()from supercall-> notifyDataSetChanged()call)