显示专辑和艺术家与LoaderManager和CursorLoader列表视图 [英] Display Album and Artist in listview with LoaderManager and CursorLoader
问题描述
我有一个 ListFragment
的名单应diplay设备,并使用 MediaStore
相关艺术家的专辑。每一行都有这样两个 TextViews
。
我使用 LoaderManager
和 CursorLoader
来填充列表起来,用一个自定义的CursorAdapter以绑定 TextViews
。
I have a ListFragment
whose list should diplay the Albums of the device and the associated artist using MediaStore
. Each row has thus two TextViews
.
I'm using LoaderManager
and CursorLoader
to fill the list up, with a custom CursorAdapter in order to bind the TextViews
of the row to the data.
ListFragment code:
public class AlbumsFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {
AlbumsAdapter mAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View myFragmentView = inflater.inflate(R.layout.albums_fragment_layout, container, false);
return myFragmentView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setListAdapter(mAdapter);
getLoaderManager().initLoader(0, null, this);
}
static final String[] ALBUM_SUMMARY_PROJECTION = { MediaStore.Audio.Albums.ALBUM, MediaStore.Audio.Albums.ARTIST};
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String select = null;
return new CursorLoader(getActivity(), MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,ALBUM_SUMMARY_PROJECTION, select, null, null);
}
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
mAdapter.swapCursor(data);
}
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.swapCursor(null);
}
}
AlbumsAdapter(自定义的CursorAdapter)code:
public class AlbumsAdapter extends CursorAdapter {
private final LayoutInflater mInflater;
public AlbumsAdapter(Context context, Cursor c) {
super(context, c);
mInflater=LayoutInflater.from(context);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView albumTitle =(TextView)view.findViewById(R.id.albumTextView);
albumTitle.setText(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM)));
TextView artistName=(TextView)view.findViewById(R.id.artistTextView);
artistName.setText(cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Albums.ARTIST)));
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
final View view=mInflater.inflate(R.layout.albums_row,parent,false);
return view;
}
有关的那一刻,当我显示此ListFragment,我有一个显示java.lang.NullPointerException,这里是logcat的:
For the moment, when I display this ListFragment, I have a java.lang.NullPointerException, here is the logCat :
06-14 09:39:23.109: W/dalvikvm(8632): threadid=1: thread exiting with uncaught exception (group=0x40c2d1f8)
06-14 09:39:23.109: E/AndroidRuntime(8632): FATAL EXCEPTION: main
06-14 09:39:23.109: E/AndroidRuntime(8632): java.lang.NullPointerException
06-14 09:39:23.109: E/AndroidRuntime(8632): at com.music.pod.AlbumsFragment.onLoadFinished(AlbumsFragment.java:61)
06-14 09:39:23.109: E/AndroidRuntime(8632): at com.music.pod.AlbumsFragment.onLoadFinished(AlbumsFragment.java:1)
06-14 09:39:23.109: E/AndroidRuntime(8632): at android.app.LoaderManagerImpl$LoaderInfo.callOnLoadFinished(LoaderManager.java:438)
06-14 09:39:23.109: E/AndroidRuntime(8632): at android.app.LoaderManagerImpl$LoaderInfo.onLoadComplete(LoaderManager.java:406)
06-14 09:39:23.109: E/AndroidRuntime(8632): at android.content.Loader.deliverResult(Loader.java:125)
06-14 09:39:23.109: E/AndroidRuntime(8632): at android.content.CursorLoader.deliverResult(CursorLoader.java:88)
06-14 09:39:23.109: E/AndroidRuntime(8632): at android.content.CursorLoader.deliverResult(CursorLoader.java:42)
06-14 09:39:23.109: E/AndroidRuntime(8632): at android.content.AsyncTaskLoader.dispatchOnLoadComplete(AsyncTaskLoader.java:236)
06-14 09:39:23.109: E/AndroidRuntime(8632): at android.content.AsyncTaskLoader$LoadTask.onPostExecute(AsyncTaskLoader.java:76)
06-14 09:39:23.109: E/AndroidRuntime(8632): at android.os.AsyncTask.finish(AsyncTask.java:602)
06-14 09:39:23.109: E/AndroidRuntime(8632): at android.os.AsyncTask.access$600(AsyncTask.java:156)
06-14 09:39:23.109: E/AndroidRuntime(8632): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
06-14 09:39:23.109: E/AndroidRuntime(8632): at android.os.Handler.dispatchMessage(Handler.java:99)
06-14 09:39:23.109: E/AndroidRuntime(8632): at android.os.Looper.loop(Looper.java:137)
06-14 09:39:23.109: E/AndroidRuntime(8632): at android.app.ActivityThread.main(ActivityThread.java:4507)
06-14 09:39:23.109: E/AndroidRuntime(8632): at java.lang.reflect.Method.invokeNative(Native Method)
06-14 09:39:23.109: E/AndroidRuntime(8632): at java.lang.reflect.Method.invoke(Method.java:511)
06-14 09:39:23.109: E/AndroidRuntime(8632): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
06-14 09:39:23.109: E/AndroidRuntime(8632): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
06-14 09:39:23.109: E/AndroidRuntime(8632): at dalvik.system.NativeStart.main(Native Method)
能否请你帮我纠正我的code才能有专辑并显示到ListView中相关的艺术家?
Could you please help me to correct my code in order to have the album and the associated artist displayed into the listview ?
问题解决了:
对于任何试图填补了专辑,艺术家等的自定义列表视图......与技术LoaderManager / CursorLoader你应该:
For anyone trying to fill up a custom listview with Album,Artist,etc... with the technique LoaderManager/CursorLoader you should :
1)创建自定义的CursorAdapter结合您的行TextViews到游标的数据(见我的自定义的CursorAdapter以上)
1) Create your own Custom CursorAdapter which binds TextViews of your row to Cursor's data(see my Custom CursorAdapter above)
2)然后,在你的片段这里做什么:
2) Then, in your fragment here's what to do :
public class AlbumsFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor> {
AlbumsAdapter mAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View myFragmentView = inflater.inflate(R.layout.albums_fragment_layout, container, false);
return myFragmentView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mAdapter = new AlbumsAdapter(getActivity(), null);
setListAdapter(mAdapter);
getLoaderManager().initLoader(0, null, this);
}
static final String[] ALBUM_SUMMARY_PROJECTION = { MediaStore.Audio.Albums._ID, MediaStore.Audio.Albums.ALBUM, MediaStore.Audio.Albums.ARTIST};
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String select = null;
return new CursorLoader(getActivity(), MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,ALBUM_SUMMARY_PROJECTION, select, null, null);
}
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
mAdapter.swapCursor(data);
}
public void onLoaderReset(Loader<Cursor> loader) {
mAdapter.swapCursor(null);
}
}
这就是它!我不知道为什么从来没有人购买有关如何使用LoaderManager,CursorLoader和自定义适配器,以填补自定义列表视图一个非常简单的例子是这样的。无论如何,我希望这将有助于初学者和我一样的未来。
And that's it !!! I don't know why nobody has ever procured a very simple example like this about how to use LoaderManager,CursorLoader and Custom adapter in order to fill a custom listview. Anyway, I hope this will help beginners like me in the future.
推荐答案
我觉得你的 mAdapter
是空
(我没有看到你初始化它,如果你初始化它),当您尝试调换光标就抛出异常。
I think your mAdapter
is null
(I don't see where you initialized it, if you initialized it) and when you try to swap the cursor it throws that exception.
如果你没有初始化的 AlbumAdapter
引用然后设置适配器之前,你应该这样做:
if you didn't initialized that AlbumAdapter
reference then you should do it before you set the adapter:
mAdapter = new AlbumsAdapter(getActivity(), null);
setListAdapter(mAdapter);
这篇关于显示专辑和艺术家与LoaderManager和CursorLoader列表视图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!