Must we call getLoaderManager().initLoader(0, null, this) after setListAdapter(adapter)?
-
21-12-2019 - |
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.
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.