目前我有一个FragmentList
,这有一个LoaderCallbacks<Cursor>
类。现在我想实现我自己的CustomLoader。
我的 FragmentList 正在使用
ListAdapter
从 SimpleCursorAdapter 扩展的类- 一个
ListLoaderCallbacks
比实现 LoaderCallbacks的类 - 该类在她的方法中
ListLoaderCallbacks
使用 aCursorLoader
onCreateLoader
问题是我的表正在增长,我需要一个更强大的实现,我想通过使用自定义类来实现我自己的加载器
更新
我第一次构建了自己AsyncTaskLoader<D>
的列表,显示数据加载正常,但是当数据更改时,加载器不会更新。首先我有一个 ContentProvider 并且可以正常工作SimpleCursorLoader
,CursorAdapter
但不能与我的实现配合使用。这是课程
BaseLoader.java
public abstract class BaseLoader<D> extends AsyncTaskLoader<D> {
protected D mData;
public BaseLoader(Context context) {
super(context);
}
@Override
public void deliverResult(D data) {
if (isReset()) {
return;
}
this.mData = data;
super.deliverResult(data);
}
@Override
protected void onStartLoading() {
if (mData != null) {
deliverResult(mData);
}
if (takeContentChanged() || mData == null) {
forceLoad();
}
}
@Override
protected void onStopLoading() {
cancelLoad();
}
@Override
protected void onReset() {
super.onReset();
onStartLoading();
mData = null;
}
}
CustomLoader.java
public class CustomLoader extends BaseLoader<List<Custom>> {
final private Observer mObserver = new Observer(null);
public LatestPromotionLoader(Context context) {
super(context);
}
@Override
public List<Custom> loadInBackground() {
final Cursor c = queryOnContentProvider();
final HashMap<String, Integer> counters = resultFromOtherQueryContentProvider();
final List<Custom> customs = new ArrayList<Custom>();
while (c.moveToNext()) {
final Custom p = Custom.fromCursor(c);
if (counters.get(p.getCategory()) != null) {
p.setCounter(counters.get(p.getCategory()));
}
customs.add(p);
}
return customs;
}
private HashMap<String, Integer> resultFromOtherQueryContentProvider() {
// ...
}
private Cursor queryOnContentProvider() {
// ...
}
@Override
protected void onStopLoading() {
super.onStopLoading();
getContext().getContentResolver().unregisterContentObserver(mObserver);
}
@Override
protected void onStartLoading() {
super.onStartLoading();
getContext()
.getContentResolver().registerContentObserver(Custom.CONTENT_URI, true, mObserver);
}
public class Observer extends ContentObserver {
public Observer(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
forceLoad();
}
}
}