DJ180
DJ180

Reputation: 19854

Listener to be notified after view refreshes

My project consists of a single Activity so far that loads a GridView that is populated by an extended BaseAdapter. Typically the view is refreshed by calling BaseAdapter.notifyDataSetChanged() from one of my OnClickListener objects.

My problem is that I need to start a timer each time the view is refreshed. I only want to do this when the view has been completely reloaded.

I can't seem to find a listener or method that I can override in either the View or Adapter APIs to perform this, although I presume there is one. The closest I've found is BaseAdapter.registerDataSetObserver although I'm not sure this is what I'm looking for either.

Can anyone advise please?

Thanks

Upvotes: 0

Views: 385

Answers (2)

Caspar Harmer
Caspar Harmer

Reputation: 8117

I'd say your best bet would be to create an anon inner class from this class and add your timer logic in an extension of GridView:

class AdapterDataSetObserver extends DataSetObserver {

    @Override
    public void onChanged() {

    }

    @Override
    public void onInvalidated() {

    }
}

(You can access this member variable as it is not priveate):

/**
 * Should be used by subclasses to listen to changes in the dataset
 */
AdapterDataSetObserver mDataSetObserver;

This is the method that you should override (inside gridview) (You may need to make some modifications as some of these member variables may be private - mDataSetObserver is not, however:

@Override
public void setAdapter(ListAdapter adapter) {
    if (null != mAdapter) {
        mAdapter.unregisterDataSetObserver(mDataSetObserver);
    }

    resetList();
    mRecycler.clear();
    mAdapter = adapter;

    mOldSelectedPosition = INVALID_POSITION;
    mOldSelectedRowId = INVALID_ROW_ID;

    if (mAdapter != null) {
        mOldItemCount = mItemCount;
        mItemCount = mAdapter.getCount();
        mDataChanged = true;
        checkFocus();

        mDataSetObserver = new AdapterDataSetObserver();
        mAdapter.registerDataSetObserver(mDataSetObserver);

        mRecycler.setViewTypeCount(mAdapter.getViewTypeCount());

        int position;
        if (mStackFromBottom) {
            position = lookForSelectablePosition(mItemCount - 1, false);
        } else {
            position = lookForSelectablePosition(0, true);
        }
        setSelectedPositionInt(position);
        setNextSelectedPositionInt(position);
        checkSelectionChanged();
    } else {
        checkFocus();
        // Nothing selected
        checkSelectionChanged();
    }

    requestLayout();
} 

Look for these two lines in the method above and extend your class here:

        mDataSetObserver = new AdapterDataSetObserver();
        mAdapter.registerDataSetObserver(mDataSetObserver);

Upvotes: 0

Dan S
Dan S

Reputation: 9189

DataSetObserver won't provide the feature you're looking for. In your adapter try looking at getView() or ViewBinder.setViewBinder() (for the Simple...Adapter classes) once the last view is filled with data you'll be able to know, roughly, when its done.

Upvotes: 1

Related Questions