package com.tencent.widget; import android.database.DataSetObservable; import android.database.DataSetObserver; import android.widget.BaseAdapter; public abstract class XBaseAdapter extends BaseAdapter implements XListAdapter { /** * 内部使用, 数据更新的监听器 * * */ static interface ListDataSetListener { public abstract void onRowInserted(int first, int last); public abstract void onRowDeleted(int first, int last); public abstract void onRowDeleted(int... deleteRows); public abstract void onRowUpdated(int first, int last); } private final ListDataSetObservable mDataSetObservable = new ListDataSetObservable(); class ListDataSetObservable extends DataSetObservable { public void notifyRowInserted(int first, int last) { synchronized(mObservers) { // since onChanged() is implemented by the app, it could do anything, including // removing itself from {@link mObservers} - and that could cause problems if // an iterator is used on the ArrayList {@link mObservers}. // to avoid such problems, just march thru the list in the reverse order. for (int i = mObservers.size() - 1; i >= 0; i--) { DataSetObserver dataSetObserver = mObservers.get(i); if(dataSetObserver instanceof ListDataSetListener) { ((ListDataSetListener) dataSetObserver).onRowInserted(first, last); } else { dataSetObserver.onChanged(); } } } } public void notifyRowDeleted(int first, int last) { synchronized(mObservers) { // since onChanged() is implemented by the app, it could do anything, including // removing itself from {@link mObservers} - and that could cause problems if // an iterator is used on the ArrayList {@link mObservers}. // to avoid such problems, just march thru the list in the reverse order. for (int i = mObservers.size() - 1; i >= 0; i--) { DataSetObserver dataSetObserver = mObservers.get(i); if(dataSetObserver instanceof ListDataSetListener) { ((ListDataSetListener) dataSetObserver).onRowDeleted(first, last); } else { dataSetObserver.onChanged(); } } } } public void notifyRowDeleted(int... rows) { synchronized(mObservers) { // since onChanged() is implemented by the app, it could do anything, including // removing itself from {@link mObservers} - and that could cause problems if // an iterator is used on the ArrayList {@link mObservers}. // to avoid such problems, just march thru the list in the reverse order. for (int i = mObservers.size() - 1; i >= 0; i--) { DataSetObserver dataSetObserver = mObservers.get(i); if(dataSetObserver instanceof ListDataSetListener) { ((ListDataSetListener) dataSetObserver).onRowDeleted(rows); } else { dataSetObserver.onChanged(); } } } } public void notifyRowUpdated(int first, int last) { // since onChanged() is implemented by the app, it could do anything, including // removing itself from {@link mObservers} - and that could cause problems if // an iterator is used on the ArrayList {@link mObservers}. // to avoid such problems, just march thru the list in the reverse order. for (int i = mObservers.size() - 1; i >= 0; i--) { DataSetObserver dataSetObserver = mObservers.get(i); if(dataSetObserver instanceof ListDataSetListener) { ((ListDataSetListener) dataSetObserver).onRowUpdated(first, last); } else { dataSetObserver.onChanged(); } } } } @Override public void registerDataSetObserver(DataSetObserver observer) { mDataSetObservable.registerObserver(observer); } @Override public void unregisterDataSetObserver(DataSetObserver observer) { mDataSetObservable.unregisterObserver(observer); } @Override public void notifyDataSetChanged() { mDataSetObservable.notifyChanged(); } @Override public void notifyDataSetInvalidated() { mDataSetObservable.notifyInvalidated(); } /** * 通知某几行被添加(firstRow~firstRow) * @param firstRow * @param lastRow */ public void notifyRowInserted(int firstRow, int lastRow) { mDataSetObservable.notifyRowInserted(firstRow, lastRow); } /** * 通知某几行被删除(firstRow~firstRow) * @param firstRow * @param lastRow */ public void notifyRowDeleted(int firstRow, int lastRow) { mDataSetObservable.notifyRowDeleted(firstRow, lastRow); } /** * 通知某几行被删除(非连续的) * @param firstRow * @param lastRow */ public void notifyRowsDeleted(int... rows) { mDataSetObservable.notifyRowDeleted(rows); } /** * 通知某几行被修改 * @param firstRow * @param lastRow */ public void notifyRowUpdated(int firstRow, int lastRow) { mDataSetObservable.notifyRowUpdated(firstRow, lastRow); } }