从listView中删除标题

has*_*txo 22 android listview header

我试图从一个删除标题时遇到一些问题listView.起初我用addHeaderView()它来添加它,但是当我改为另一个布局时我希望它消失但removeHeaderView()不起作用......

我也试过设置GONE的可见性,但它并没有消失......

我能做什么?

提前致谢

Pra*_*gar 52

尝试下面提到的方法..

Android ListView#addHeaderViewListView#addFooterView方法很奇怪:在设置ListView的适配器之前必须添加页眉和页脚视图,以便ListView可以考虑页眉和页脚 - 否则会出现异常.这里我们添加一个ProgressBar(微调器)作为headerView:

// spinner是一个ProgressBar

listView.addHeaderView(spinner);
Run Code Online (Sandbox Code Playgroud)

我们希望能够随意显示和隐藏该微调器,但是彻底删除它是危险的,因为我们永远无法在不破坏ListView的情况下再次添加它 - 记住,我们之后无法添加HeaderView它的适配器:

listView.removeHeaderView(spinner); //dangerous!
Run Code Online (Sandbox Code Playgroud)

所以,让我们隐藏吧!结果证明这也很难.只是隐藏微调器视图本身会导致一个空的但仍然可见的标题区域.

现在尝试隐藏微调器:

spinner.setVisibility(View.GONE);
Run Code Online (Sandbox Code Playgroud)

结果:标题区域仍然可见,空间很难看:

解决方案是将进度条放在包含其内容的LinearLayout中,并隐藏内容.这样包装LinearLayout会在其内容被隐藏时崩溃,从而导致headerView在技术上仍然存在,但是0dip高:

<LinearLayout 
      xmlns:a="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content">
    <!-- simplified -->
      <ProgressBar
        android:id="@+id/spinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/> 
  </LinearLayout>
Run Code Online (Sandbox Code Playgroud)

然后,将布局设置为标题:

spinnerLayout = getLayoutInflater().inflate(R.layout.header_view_spinner, null);
listView.addHeaderView(spinnerLayout);
Run Code Online (Sandbox Code Playgroud)

当我们需要隐藏它时,隐藏布局的内容,而不是布局:

spinnerLayout.findViewById(R.id.spinner).setVisibility(View.GONE);
Run Code Online (Sandbox Code Playgroud)

现在标题从视图中消失了.顶部没有更难看的空间!


rup*_*pps 17

大多数人不喜欢使用AddHeaderView,但我有时发现它很方便,避免修改复杂的适配器,或者标题与它们不是很相关.

通过这个简单的技巧,您将能够无缝删除/添加标题:

我添加一个空的 LinearLayoutwith orientation vertical和height wrap_content作为唯一的Header View(让我们mListView成为目标listView):

 LinearLayout mCustomHeaders=new LinearLayout(context);
 mCustomHeaders.setOrientation(LinearLayout.VERTICAL);

 mListView.addHeaderView(mCustomHeaders);
 mListView.setAdapter (.......)
Run Code Online (Sandbox Code Playgroud)

Thenafter,我可以在任何地方随机添加随机内容作为标题,即使列表已满:

 mCustomHeaders.add(myHeaderView1);
 mCustomHeaders.add(myHeaderView2);
 mCustomHeaders.add(myHeaderView3);
Run Code Online (Sandbox Code Playgroud)

您也可以随时删除所有标题:

 mCustomHeaders.removeAllViews(); // will erase all headers
Run Code Online (Sandbox Code Playgroud)

你明白了......希望它有所帮助!


sag*_*its 5

问题是当你这样做时你总是在创建一个新对象:

 View headerView = someView
Run Code Online (Sandbox Code Playgroud)

因此,新视图与已添加为 listView 标头的视图不同,请尝试以下操作:

View headerView = inflater.inflate(R.layout.adapter_datatable_saleitem_header, null, false);
        headerView.setTag(this.getClass().getSimpleName() + "header");
        if (listView.getHeaderViewsCount() > 0) {
            View oldView = listView.findViewWithTag(this.getClass().getSimpleName() + "header");
            if (oldView != null) {
                listView.removeHeaderView(oldView);
            }
        }
Run Code Online (Sandbox Code Playgroud)


Mil*_*vic 0

如果您使用 addHeaderView(),则此后将无法删除标题。

因此,不要使用 addHeaderView()。相反,创建您自己的适配器,将您的主要视图名册与标题混合在一起。虽然我的 MergeAdapter 无法处理您的特定情况,但您可以使用它来查看混合多个行源的概念:

https://github.com/commonsguy/cwac-merge