Reputation: 19854
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
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