在ListFragment中添加Header的最佳位置

bro*_*oli 34 android listview header adapter android-fragments

我在列表中设置自定义标题时遇到了一些麻烦.

我正在使用自定义适配器创建ListFragment.我的列表工作正常,但我正在试图找出片段的生命周期中附加标题的位置.

我知道在设置适配器之前必须添加标头.

我尝试在onActivityCreated中添加我的标题,但是每次我的Fragment从backstack返回时都会调用它,并且因为我还在onActivityCreated中设置了我的适配器,所以它失败了.

我尝试在onCreate中添加它,但视图层次结构在生命周期的那个阶段不可用.

我尝试在onCreateView中添加它,但我无法将从inflate返回的视图转换为ListView.所以我无法将标题添加到香草视图中.

有什么想法吗?

ugo*_*ugo 34

我不知道你是否解决了你的问题,但这里有一个对我有用的解决方案:

不要打电话给ListFragment.setListAdapter()ListFragment.onCreate().确保你有一个可以保存标题视图的字段变量,可能是这样的:

View mheaderView;
Run Code Online (Sandbox Code Playgroud)

然后在你的ListFragment.onCreateView(),膨胀标题View并将其分配给你的变量,如下所示:

View list_root = inflater.inflate(R.layout.fragment_list, null);
// Get the list header - to be added later in the lifecycle
// during onActivityCreated()
mheaderView = inflater.inflate(R.layout.list_header, null);
return list_root;
Run Code Online (Sandbox Code Playgroud)

最后,在你ListFragment.onActivityCreated() 现在可以打电话ListFragment.getListView().addHeaderView().基本上是这样的:

super.onActivityCreated(savedInstanceState);
if (mheaderView != null)  this.getListView().addHeaderView(headerView);
// Don't forget to now call setListAdapter()
this.setListAdapter(listAdapter);
Run Code Online (Sandbox Code Playgroud)

  • 这对我不起作用 - 当我在调用setListAdapter后抱怨将标题视图分配给列表时,我在屏幕翻转时出现崩溃. (8认同)
  • 对于像Konklone和Naveen Chauhan这样的问题的人:在onDestroyView中调用setListAdapter(null)应该可以解决问题. (2认同)

小智 32

此解决方案适用于屏幕翻转:

在onActivityCreated()中:

getListView().addHeaderView(mHeaderView);
if (mMyAdapter == null) {
    mMyAdapter = new MyAdapter(getActivity(), null);
}
setListAdapter(mMyAdapter);
Run Code Online (Sandbox Code Playgroud)

在onDestroyView()中

setListAdapter(null);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢这个帮助我的.而且我认为这是ListFragment中的错误应该自己处理. (2认同)

Jak*_*son 18

我的解决方案

public void onActivityCreated(Bundle savedInstanceState) {
    setListAdapter(null);
    getListView().addHeaderView(mHeader);
    setListAdapter(mAdapter);
}
Run Code Online (Sandbox Code Playgroud)