使用自定义适配器和CursorLoader

时间:2015-05-04 20:17:22

标签: android baseadapter custom-adapter android-cursor android-cursorloader

我正在尝试使用CursorLoader从UI线程中的ContentProvider获取数据。然后我用它来填充我的列表视图。之前我正在使用SimpleCursorAdapter,它一切正常。但是现在我希望根据数据对列表视图行有不同的视图。

所以我写了 自定义适配器 ,扩展了 基础适配器

public class CustomAdapter extends BaseAdapter {

    private Context mContext;
    private LayoutInflater mInflater;

    public CustomAdapter(Context context) {
        mContext = context;
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return 10;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        Log.d("CustomAdapter", "Check" + i + 1);
        if (view == null) {
            view = mInflater.inflate(R.layout.listview_text_layout, viewGroup, false);
            //if(text) load text view
            //else load image view
        }

        return view;
    }
}

但要显示任何内容,getCount()方法应返回大于0的值。

如何获取CursorLoader加载的项目数,以便显示所有元素?目前,我只是返回10使其正常工作,但这显然不是正确的方法。

这是我的Fragment类,它实现了CursorLoader

public class MessageFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {

    private AbsListView mListView;
    private CustomAdapter mAdapter;
    ...

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_message, container, false);

        getLoaderManager().initLoader(MESSAGES_LOADER, null, this);

        // Set the adapter
        mListView = (AbsListView) view.findViewById(android.R.id.list);
        mListView.setAdapter(mAdapter);

        return view;
    }


    @Override
    public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
        String[] projection = {MessageEntry._ID, MessageEntry.MESSAGE_DATA, MessageEntry.MESSAGE_TIMESTAMP};

        switch (i) {
            case MESSAGES_LOADER:
                return new CursorLoader(
                        getActivity(),
                        Uri.parse("content://com.rubberduck.dummy.provider/messages"),
                        projection,
                        null,
                        null,
                        null
                );
            default:
                return null;
        }
    }
}

此外,在我的getView()方法中,我需要访问数据,以便我可以选择要膨胀的布局。我知道我们可以将数据列表传递给 自定义适配器 ,但是当CursorLoader实际加载数据时我们该如何做?

2 个答案:

答案 0 :(得分:0)

您可以扩展BaseAdapter

,而不是扩展CursorAdapter

调用onLoadFinished时,您只需拨打swapCursor即可。您无需覆盖getCount()super已经负责返回正确的值。

答案 1 :(得分:0)

设置SimpleCursorAdapterViewBinder的{p> CursorAdapter足以满足您的要求,您无需延长BaseAdapter

通过LoaderManager初始化加载程序后,您将通过onLoadFinished()方法获得结果。

刷新适配器上的数据调用swapCursor()方法

请注意Activity启动onStart()中所有注册的加载器,因此启动加载程序的替代位置将位于onActivityCreated()

本教程描述了@Blackbelt和我描述的方式:

http://code.tutsplus.com/tutorials/android-fundamentals-properly-loading-data--mobile-5673

一旦你深入了解装载机,我建议你阅读这篇文章:

http://chalup.github.io/blog/2014/06/12/android-loaders/