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());