【问题标题】:Must we call getLoaderManager().initLoader(0, null, this) after setListAdapter(adapter)?我们必须在 setListAdapter(adapter) 之后调用 getLoaderManager().initLoader(0, null, this) 吗?
【发布时间】:2014-06-04 10:39:06
【问题描述】:

我刚刚注意到,我看到的每个示例都使用ListFragment 并调用

adapter = new Adapter(context);
setListAdapter(adapter);
getLoaderManager().initLoader(0, null, this);

完全按照这个顺序。

当我使用Fragment,然后这样做

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    adapter = new Adapter(mContext);
    getLoaderManager().initLoader(0, null, this);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment, container, false);
    listView = (ListView) view.findViewById(R.id.listview);

    listView.setAdapter(adapter);
    return view;
}

它不起作用。我在onLoadFinished(Loader<Cursor> loader, Cursor cursor) 内部追踪,发现adapter 不知道它的ListView,所以swapCursor(newCursor) 没有效果。

但是当我这样做时,它会起作用。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment, container, false);
    listView = (ListView) view.findViewById(R.id.listview);
    adapter = new Adapter(mContext);
    listView.setAdapter(adapter);
    getLoaderManager().initLoader(0, null, this);
    return view;
}

我觉得我知道问题所在,但我需要一个解释来确认。谢谢。

【问题讨论】:

    标签: android android-listview android-loadermanager android-loader


    【解决方案1】:

    adapter.swapCursor() 无效,因为您在适配器初始化后从未将适配器设置为 ListView。

    onCreateView()onActivityCreated() 之前调用。当您将适配器设置为 onCreateView() 内的 ListView 时,它可能为空。然后在onActivityCreated() 中初始化适配器,但与列表视图无关。

    【讨论】:

    • "onCreateView() 在 onActivityCreated() 之前被调用" 呵呵!我只记得这个。好吧..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 2021-10-01
    • 2013-06-10
    相关资源
    最近更新 更多