ContentObserver 监听数据库变化
- AbstractCursor.setNotificationUri(ContentResolver cr, Uri notifyUri) -> ContentResolver.registerContentObserver(Uri uri, boolean notifyForDescendents,
ContentObserver observer, int userHandle) - AbstractCursor.registerContentObserver(ContentObserver observer)
- SelfContentObserver.onChange(boolean selfChange) -> AbstractCursor.(boolean selfChange)
DataSetObserver 监听cursor close/deactivate/requery
- AbstractCursor.registerDataSetObserver(DataSetObserver observer)
- AbstractCursor.close() / deactivate() -> AbstractCursor.onDeactivateOrClose() -> DataSetObservable.notifyInvalidated()
- AbstractCursor.requery() -> DataSetObservable.notifyChanged()
notifyDataSetChanged 与 notifyDataSetInvalidated 区别 (@AdapterView.java): 前者会保留listview的部分状态,而后者会重置listview的状态
class AdapterDataSetObserver extends DataSetObserver {
private Parcelable mInstanceState = null;
@Override
public void onChanged() {
mDataChanged = true;
mOldItemCount = mItemCount;
mItemCount = getAdapter().getCount();
if (AdapterView.this.getAdapter().hasStableIds() && mInstanceState != null
&& mOldItemCount == 0 && mItemCount > 0) {
AdapterView.this.onRestoreInstanceState(mInstanceState);
mInstanceState = null;
} else {
rememberSyncState();
}
checkFocus();
requestLayout();
}
@Override
public void onInvalidated() {
mDataChanged = true;
if (AdapterView.this.getAdapter().hasStableIds()) {
mInstanceState = AdapterView.this.onSaveInstanceState();
}
mOldItemCount = mItemCount;
mItemCount = 0;
mSelectedPosition = INVALID_POSITION;
mSelectedRowId = INVALID_ROW_ID;
mNextSelectedPosition = INVALID_POSITION;
mNextSelectedRowId = INVALID_ROW_ID;
mNeedSync = false;
checkFocus();
requestLayout();
}
public void clearSavedState() {
mInstanceState = null;
}
}