我们必须在setListAdapter(adapter)之后调用getLoaderManager()。initLoader(0,null,this)吗?

时间:2014-06-04 10:39:06

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

我刚注意到我看到的每个示例都使用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;
}

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

1 个答案:

答案 0 :(得分:2)

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

onCreateView()之前调用

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