Niklas Ekman
Niklas Ekman

Reputation: 961

Override notifyDataSetChanged()

I have a custom ArrayAdapter. When data is displayed in ListViews I always want it sorted, therefore I tried to override notifyDataSetChanged() to sort the adapter first, like this:

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

The class IceContact is a get-set class that implement Comparable. Unfortunately this is giving me a, ironically, StackOverflowError (logcat below). I then tried to do it the other way around. Override sort() and call notifyDataSetChanged() directly after, like this:

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

That works just fine! Can anyone explain why? It feels like they are pretty much identical implementations.


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

Upvotes: 4

Views: 10188

Answers (3)

Женя Якорев
Женя Якорев

Reputation: 11

You can use registerAdapterDataObserver

 adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
        @Override
        public void onChanged() {
            super.onChanged();
            //your code;
        }
    });

Upvotes: 0

Boriz
Boriz

Reputation: 1

A simple way to prevent the exception would be to disable the call to notifyDataSetChanged().

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

It will be re-enabled automatically accoding to the docs:

...and calling notifyDataSetChanged() resets the flag to true.

Which is what sort() does.

Upvotes: -1

user
user

Reputation: 87064

The class IceContact is a get-set class that implement Comparable. Unfortunately this is giving me a, ironically, StackOverflowError (logcat below).

sort() calls be default(in its implementation) notifyDataSetChanged() which will then call again sort() which in turn will call notifyDataSetChanged() which will call sort() which will call...

In the notifyDataSetChanged sort the data without also calling notifyDataSetChanged() as sort() will automatically do that for you.

The second scenario will work as you'll basically call notifyDataSetChanged() two times(super.sort(), sort the data->notifyDataSetChanged() from super call-> notifyDataSetChanged() call by you)

Upvotes: 5

Related Questions