Android加载程序返回不正确的项目
我正试图了解加载器,并有什么是一个相当标准的设置-一个从数据库中提取的列表,当项目被选中时,细节被检索和显示。它在第一次单击时运行良好,但始终返回相同的数据,无论之后单击了哪个列表项。我仔细检查了代码,确定一切正常,但实际数据被忽略,因为原始加载程序被重用。下面是一些代码:Android加载程序返回不正确的项目,android,Android,我正试图了解加载器,并有什么是一个相当标准的设置-一个从数据库中提取的列表,当项目被选中时,细节被检索和显示。它在第一次单击时运行良好,但始终返回相同的数据,无论之后单击了哪个列表项。我仔细检查了代码,确定一切正常,但实际数据被忽略,因为原始加载程序被重用。下面是一些代码: @Override public void onListItemClick(ListView l, View v, int position, long id) { Cursor cursor = (Cursor
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
Cursor cursor = (Cursor)this.getListAdapter().getItem(position);
String mId = cursor.getString(cursor.getColumnIndex(COLUMN_ID));
Bundle args = new Bundle();
args.putString(ID, mId);
LoaderManager.enableDebugLogging(true);
LoaderManager lm = getLoaderManager();
lm.initLoader(1, args, new NewsLoaderCallbacks());
}
// News item callbacks
private class NewsLoaderCallbacks implements LoaderCallbacks<SingleNewsItem> {
@Override
public Loader<SingleNewsItem> onCreateLoader(int id, Bundle args) {
Log.i("DEBUG", "In oncreateloader");
return new SingleNewsItemLoader(getActivity(), args.getString(ID));
}
@Override
public void onLoadFinished(Loader<SingleNewsItem> itemLoader,
SingleNewsItem item) {
// display the item here
Log.i("DEBUG", "In onloadfinished");
Intent i = new Intent(getActivity(), SingleNewsItemActivity.class);
//i.putExtra(ID, item.getId());
i.putExtra("ID", item);
startActivity(i);
}
@Override
public void onLoaderReset(Loader<SingleNewsItem> arg0) {
// nothing
}
public class SingleNewsItemLoader extends DataLoader<SingleNewsItem> {
String mNewsItemId;
public SingleNewsItemLoader(Context context, String id) {
super(context);
mNewsItemId = id;
}
@Override
public SingleNewsItem loadInBackground() {
return NewsManager.get(getContext()).getOneItem(mNewsItemId);
}
}
如果将日志一直向左滚动,您可以看到ID已更改(它们是标题),但是如果您在调试器中停止并查看返回的item对象,它始终是第一个对象。因此SingleNewsItemLoader中的属性永远不会更改
我错过了什么?谢谢您的建议。每:
确保加载程序已初始化并处于活动状态。如果加载程序不存在,则会创建一个加载程序,并(如果活动/片段当前已启动)启动加载程序否则将重新使用上次创建的加载程序。
使用
restartLoader
以新参数重新启动加载程序。正如ianhanniballake所说,您需要使用LoaderManager.restartLoader()
或LoaderManager.distroyLoader()
然后使用LoaderManager.initLoader()
我认为您需要更改传递给initLoader()的id()
现在它是一个常量1,请尝试:
lm.initLoader(position, args, new NewsLoaderCallbacks());
一般来说,如果在第一次获取内容时不做任何特殊操作,可以使用restartLoader而不是initLoader。其中一个是一个常量,用于简单地标识加载程序,以便将其与其他加载程序区分开来。上面的第一个答案解决了问题。更改为restartLoader会导致每次调用Create方法,并且解决了这个问题。谢谢。
lm.initLoader(position, args, new NewsLoaderCallbacks());