現在、私FragmentList
はaを持っており、これにはLoaderCallbacks<Cursor>
クラスがあります。今、私は独自の CustomLoader を実装したいと考えています。
私のFragmentListは使用しています
ListAdapter
SimpleCursorAdapter から拡張されたクラスListLoaderCallbacks
LoaderCallbacks を実装するクラス- クラス
ListLoaderCallbacks
はCursorLoader
彼女のメソッドでa を使用します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();
}
}
}