0

目前我有一个FragmentList,这有一个LoaderCallbacks<Cursor>类。现在我想实现我自己的CustomLoader。

我的 FragmentList 正在使用

  • ListAdapter从 SimpleCursorAdapter 扩展的类
  • 一个ListLoaderCallbacks比实现 LoaderCallbacks的类
  • 该类在她的方法中ListLoaderCallbacks使用 aCursorLoaderonCreateLoader

问题是我的表正在增长,我需要一个更强大的实现,我想通过使用自定义类来实现我自己的加载器

更新

我第一次构建了自己AsyncTaskLoader<D>的列表,显示数据加载正常,但是当数据更改时,加载器不会更新。首先我有一个 ContentProvider 并且可以正常工作SimpleCursorLoaderCursorAdapter但不能与我的实现配合使用。这是课程

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