0

現在、私FragmentListはaを持っており、これにはLoaderCallbacks<Cursor>クラスがあります。今、私は独自の CustomLoader を実装したいと考えています。

私のFragmentListは使用しています

  • ListAdapterSimpleCursorAdapter から拡張されたクラス
  • ListLoaderCallbacksLoaderCallbacks を実装するクラス
  • クラスListLoaderCallbacksCursorLoader彼女のメソッドで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();
        }
    }
}
4

0 に答える 0