0

I am trying to learn about Loaders and have what is a fairly standard setup - a list drawn from a database, when item is selected the detail is retrieved and displayed. 它在第一次单击时运行良好,但无论之后单击哪个列表项,它总是返回相同的数据。我单步执行代码并确定一切正常,但由于重用了原始加载程序,因此忽略了真实数据。这是一些代码:

@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);
}

 }

因此 onCreateLoader 在 SingleNewsItemLoader 中设置 id 属性,并且 onLoadFinished 接收回详细项目。但是似乎当在列表上单击不同的项目时, onCreate 不会更新 id 属性。这是调试日志:

 09-30 16:04:25.997: V/LoaderManager(2599): initLoader in LoaderManager{40d16138 in  GoogleNewsMainActivity{40ced590}}: args=Bundle[{id=4 charged in mass shooting at park: 'God  took care of them' - Chicago Tribune}]
 09-30 16:04:25.997: V/LoaderManager(2599):   Starting: LoaderInfo{40e78278 #1 : SingleNewsItemLoader{40e788f8}}
 09-30 16:04:26.006: V/LoaderManager(2599):   Created new loader LoaderInfo{40e78278 #1 : SingleNewsItemLoader{40e788f8}}
 09-30 16:04:26.086: V/LoaderManager(2599): onLoadComplete: LoaderInfo{40e78278 #1 :   SingleNewsItemLoader{40e788f8}}
 09-30 16:04:26.097: V/LoaderManager(2599):   onLoadFinished in SingleNewsItemLoader{40e788f8 id=1}: SingleNewsItem{40e7bd88}
 09-30 16:04:33.376: V/LoaderManager(2599): Stopping in LoaderManager{40d16138 in GoogleNewsMainActivity{40ced590}}
 09-30 16:04:33.376: V/LoaderManager(2599):   Stopping: LoaderInfo{40e78278 #1 : SingleNewsItemLoader{40e788f8}}
 09-30 16:04:33.396: V/LoaderManager(2599):   Stopping: LoaderInfo{40d16c78 #0 : NewsListCursorLoader{40d17aa8}}
 09-30 16:04:35.436: V/LoaderManager(2599): Starting in LoaderManager{40d16138 in GoogleNewsMainActivity{40ced590}}
 09-30 16:04:35.436: V/LoaderManager(2599):   Starting: LoaderInfo{40e78278 #1 : SingleNewsItemLoader{40e788f8}}
 09-30 16:04:35.446: V/LoaderManager(2599): onLoadComplete: LoaderInfo{40e78278 #1 : SingleNewsItemLoader{40e788f8}}
 09-30 16:04:35.446: V/LoaderManager(2599):   Starting: LoaderInfo{40d16c78 #0 : NewsListCursorLoader{40d17aa8}}
 09-30 16:04:35.446: V/LoaderManager(2599): onLoadComplete: LoaderInfo{40d16c78 #0 :  NewsListCursorLoader{40d17aa8}}
 09-30 16:04:39.136: V/LoaderManager(2599): initLoader in LoaderManager{40d16138 in GoogleNewsMainActivity{40ced590}}: args=Bundle[{id=Conservatives resolute on Obamacare, but Sen. Coburn says strategy won't work - Washington Post}]
 09-30 16:04:39.136: V/LoaderManager(2599):   Re-using existing loader LoaderInfo{40e78278 #1 : SingleNewsItemLoader{40e788f8}}
 09-30 16:04:39.196: V/LoaderManager(2599):   onLoadFinished in SingleNewsItemLoader{40e788f8 id=1}: SingleNewsItem{40e7bd88}
 09-30 16:04:45.795: V/LoaderManager(2599): Stopping in LoaderManager{40d16138 in GoogleNewsMainActivity{40ced590}}
 09-30 16:04:45.795: V/LoaderManager(2599):   Stopping: LoaderInfo{40e78278 #1 : S   ingleNewsItemLoader{40e788f8}}
 09-30 16:04:45.805: V/LoaderManager(2599):   Stopping: LoaderInfo{40d16c78 #0 : NewsListCursorLoader{40d17aa8}}
 09-30 16:04:46.235: V/LoaderManager(2599): Starting in LoaderManager{40d16138 in GoogleNewsMainActivity{40ced590}}
 09-30 16:04:46.235: V/LoaderManager(2599):   Starting: LoaderInfo{40e78278 #1 : SingleNewsItemLoader{40e788f8}}
 09-30 16:04:46.255: V/LoaderManager(2599): onLoadComplete: LoaderInfo{40e78278 #1 : SingleNewsItemLoader{40e788f8}}
 09-30 16:04:46.255: V/LoaderManager(2599):   Starting: LoaderInfo{40d16c78 #0 : NewsListCursorLoader{40d17aa8}}
 09-30 16:04:46.296: V/LoaderManager(2599): onLoadComplete: LoaderInfo{40d16c78 #0 : NewsListCursorLoader{40d17aa8}}
 09-30 16:06:23.906: V/LoaderManager(2599): initLoader in LoaderManager{40d16138 in GoogleNewsMainActivity{40ced590}}: args=Bundle[{id=Obama directs Kerry to pursue talks with Iran over nuclear weapons deal - Fox News}]
 09-30 16:06:23.906: V/LoaderManager(2599):   Re-using existing loader LoaderInfo{40e78278 #1 : SingleNewsItemLoader{40e788f8}}
 09-30 16:06:23.936: V/LoaderManager(2599):   onLoadFinished in SingleNewsItemLoader{40e788f8 id=1}: SingleNewsItem{40e7bd88}
 09-30 16:06:29.066: V/LoaderManager(2599): Stopping in LoaderManager{40d16138 in GoogleNewsMainActivity{40ced590}}
 09-30 16:06:29.066: V/LoaderManager(2599):   Stopping: LoaderInfo{40e78278 #1 : SingleNewsItemLoader{40e788f8}}
 09-30 16:06:29.066: V/LoaderManager(2599):   Stopping: LoaderInfo{40d16c78 #0 : NewsListCursorLoader{40d17aa8}}
 09-30 16:06:34.316: V/LoaderManager(2599): Starting in LoaderManager{40d16138 in GoogleNewsMainActivity{40ced590}}
 09-30 16:06:34.316: V/LoaderManager(2599):   Starting: LoaderInfo{40e78278 #1 : SingleNewsItemLoader{40e788f8}}
 09-30 16:06:34.316: V/LoaderManager(2599): onLoadComplete: LoaderInfo{40e78278 #1 : SingleNewsItemLoader{40e788f8}}
  09-30 16:06:34.316: V/LoaderManager(2599):   Starting: LoaderInfo{40d16c78 #0 : NewsListCursorLoader{40d17aa8}}
 09-30 16:06:34.325: V/LoaderManager(2599): onLoadComplete: LoaderInfo{40d16c78 #0 : NewsListCursorLoader{40d17aa8}}

如果将日志一直滚动到左侧,您可以看到 ID 已更改(它们是标题),但如果您在调试器中停下来查看返回的项目对象,它始终是第一个。所以 SingleNewsItemLoader 中的属性永远不会改变。

我在这里想念什么?感谢您的任何建议。

4

3 回答 3

1

每个LoaderManager.initLoader()

确保加载程序已初始化并处于活动状态。如果加载器尚不存在,则创建一个并(如果活动/片段当前已启动)启动加载器。否则,最后创建的加载器将被重新使用。

用于使用restartLoader新参数重新启动加载程序。

于 2013-09-30T16:44:54.763 回答
0

就像 ianhanniballake 说的那样,你需要使用LoaderManager.restartLoader()orLoaderManager.distroyLoader()然后使用LoaderManager.initLoader()

于 2013-09-30T16:51:41.467 回答
0

我认为您现在需要更改要传递的 idinitLoader()它是一个常数 1,请尝试:

lm.initLoader(position, args, new NewsLoaderCallbacks());
于 2013-09-30T17:00:29.627 回答