我正在尝试使用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
实际加载数据时我们该如何做?
答案 0 :(得分:0)
您可以扩展BaseAdapter
。
CursorAdapter
调用onLoadFinished
时,您只需拨打swapCursor
即可。您无需覆盖getCount()
。 super
已经负责返回正确的值。
答案 1 :(得分:0)
SimpleCursorAdapter
或ViewBinder
的{p> CursorAdapter
足以满足您的要求,您无需延长BaseAdapter
。
通过LoaderManager
初始化加载程序后,您将通过onLoadFinished()
方法获得结果。
刷新适配器上的数据调用swapCursor()
方法
请注意Activity
启动onStart()
中所有注册的加载器,因此启动加载程序的替代位置将位于onActivityCreated()
。
本教程描述了@Blackbelt和我描述的方式:
http://code.tutsplus.com/tutorials/android-fundamentals-properly-loading-data--mobile-5673
一旦你深入了解装载机,我建议你阅读这篇文章: