Question

I just noticed that every example that I have seen uses ListFragment and calls

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

exactly in that order.

When I use Fragment, and do this

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

it doesn't work. I traced inside onLoadFinished(Loader<Cursor> loader, Cursor cursor) and noticed that the adapter doesn't know its ListView, so the swapCursor(newCursor) doesn't have an effect.

But when I do this, it works.

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

I feel like I know the problem, but I need an explanation to confirm. Thanks.

Was it helpful?

Solution

adapter.swapCursor() has no effect because you never set the adapter to the ListView after the adapter was initialized.

onCreateView() is called before onActivityCreated(). When you are setting the adapter to the ListView inside onCreateView() it is probably null. Then in onActivityCreated() you initialize the adapter but is not related to the listview.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top