尝试从listView
删除标头时遇到了一些问题。我首先使用addHeaderView()
添加它,但是当我更改为另一个布局时,我希望它消失,但removeHeaderView()
不起作用...
我也试过设置GONE的可见性并且它不会消失......
我该怎么办?
提前致谢
答案 0 :(得分:52)
尝试下面提到的方法..
Android ListView#addHeaderView
和ListView#addFooterView
方法很奇怪:在设置ListView的适配器之前必须添加页眉和页脚视图,以便ListView可以考虑页眉和页脚 - 你得到一个否则。这里我们添加一个ProgressBar(微调器)作为headerView:
// spinner是ProgressBar
listView.addHeaderView(spinner);
我们希望能够随意显示和隐藏该微调器,但是彻底删除它是危险的,因为我们永远无法在不破坏ListView的情况下再次添加它 - 记住,我们之后无法添加HeaderView我们有它的适配器:
listView.removeHeaderView(spinner); //dangerous!
所以让我们隐藏吧!结果证明这也很难。只是隐藏微调器视图本身会导致一个空的但仍然可见的标题区域。
现在尝试隐藏微调器:
spinner.setVisibility(View.GONE);
结果:标题区域仍然可见,空间很大:
解决方案是将进度条放在包含其内容的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>
然后,将布局设置为标题:
spinnerLayout = getLayoutInflater().inflate(R.layout.header_view_spinner, null);
listView.addHeaderView(spinnerLayout);
当我们需要隐藏它时,隐藏布局的内容,而不是布局:
spinnerLayout.findViewById(R.id.spinner).setVisibility(View.GONE);
现在标题从视图中消失。顶部没有更难看的空间!
答案 1 :(得分:17)
大多数人不喜欢使用AddHeaderView
,但我有时发现它非常方便,以避免修改复杂的适配器,或者标题与它们不是很相关。
通过这个简单的技巧,您将能够无缝删除/添加标题:
我添加一个空LinearLayout
orientation vertical
,高wrap_content
,作为唯一的标题视图(让mListView
成为目标listView
):< / p>
LinearLayout mCustomHeaders=new LinearLayout(context);
mCustomHeaders.setOrientation(LinearLayout.VERTICAL);
mListView.addHeaderView(mCustomHeaders);
mListView.setAdapter (.......)
Thenafter,我可以在任何地方随机添加随机内容作为标题,即使列表已满:
mCustomHeaders.add(myHeaderView1);
mCustomHeaders.add(myHeaderView2);
mCustomHeaders.add(myHeaderView3);
您也可以随时删除所有标题:
mCustomHeaders.removeAllViews(); // will erase all headers
你明白了......希望它有所帮助!
答案 2 :(得分:3)
问题是,当你这样做时,你总是在创建一个新对象:
View headerView = someView
因此新视图与已添加为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);
}
}
答案 3 :(得分:1)
drawerLogoView
是我的标题视图,这是我的所作所为:
drawerLogoView = mInflater.inflate(R.layout.navigation_drawer_custom_layout, null);
mDrawerList.addHeaderView(drawerLogoView,null,false);
LinearLayout layOut = ((LinearLayout)drawerLogoView.findViewById(R.id.NavProfilePreviewLayout));
layOut.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, 0));
这样,它变得不可见:D 要显示它,您可以使用:
LinearLayout layOut = ((LinearLayout)drawerLogoView.findViewById(R.id.NavProfilePreviewLayout));
layOut.setLayoutParams(newRelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT));
答案 4 :(得分:1)
您可以查看标题计数&gt; 0然后删除标题并再次添加。
它对我来说很好。
View _headerView;
private void function HandleHeaderView(){
if(listView.getHeaderViewsCount() > 0)
{
listView.removeHeaderView(_headerView);
}
/* Add list view header */
_headerView = GetHeaderView();
listView.addHeaderView(_headerView);
}
private View GetHeaderView()
{
View header = getLayoutInflater().inflate(R.layout.header_layout, null);
// TODO: ...
return header
}
答案 5 :(得分:0)
如果您使用的是addHeaderView(),则无法删除标题。
所以,不要使用addHeaderView()。相反,创建自己的适配器 将您的主要视图名称与标题混合在一起。虽然我的 MergeAdapter不会处理您的具体情况,您可以使用它来查看 混合多行源的概念:
答案 6 :(得分:0)
我在一个稍微伪装的场景中遇到了这个问题:我正在处理的ListView来自PreferenceFragment,标题代表一个PreferenceCategory。因此,我设置ListView的自由受到严重限制。但有两种方法(部分受到本页其他答案的启发)。一种是向我的PreferenceCategory添加自定义布局(使用extends android.preference.PreferenceCategory
的类,请参阅 Custom PreferenceCategory Headings )。但我找到了一个更简单的解决方法:对于此PreferenceCategory中的第一个Preference,我覆盖了onCreateView()
:
@Override public View onCreateView(ViewGroup parent) {
parent.setTop(-parent.getChildAt(0).getTop());
return super.onCreateView(parent);
}