我有一个自定义的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
答案 0 :(得分:5)
类IceContact是一个实现Comparable的get-set类。 不幸的是,这给了我一个具有讽刺意味的StackOverflowError (下面的logcat)。
sort()
次调用是默认的(在其实施中)notifyDataSetChanged()
,然后会再次调用sort()
,而notifyDataSetChanged()
会调用sort()
来调用notifyDataSetChanged
会打电话给...
在notifyDataSetChanged()
排序中,数据不带,同时将sort()
称为notifyDataSetChanged()
将自动为您执行此操作。
第二种情况将起作用,因为您基本上会拨打super.sort()
两次(notifyDataSetChanged()
,从super
调用&gt; {对数据&gt; notifyDataSetChanged()
进行排序{1}}你打电话)
答案 1 :(得分:0)
防止异常的一种简单方法是禁用对notifyDataSetChanged()的调用。
@Override
public void notifyDataSetChanged()
{
setNotifyOnChange(false);
sort(yourComparatorInstance);
super.notifyDataSetChanged();
}
它将根据文档自动重新启用:
...并且调用notifyDataSetChanged()会将标志重置为true。
sort()的作用是什么。
答案 2 :(得分:0)
您可以使用registerAdapterDataObserver
adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onChanged() {
super.onChanged();
//your code;
}
});