zoukankan      html  css  js  c++  java
  • 如何实现可动态调整隐藏header的listview

    需求:根据某种需要,可能需要动态调整listview的页眉页脚,譬如将header作为显示板使用。
    难点:listView.addHeaderView()方法必须在setAdapter()方法前调用,否则就会抛异常。至于为什么会抛异常,查看下ListView的源代码即可发现。因此,在设置HeaderView之后又想将headerView移除或者隐藏,则需要绕很大的弯子:将adapter保存起来-移除headerView-(或者更换headerview)-再将adapter设置上去。



    隐藏headerview思路:使用View.GONE属性进行隐藏

    尝试1.itemView结构如下:

    <LinearLayout android:id="@+id/item_root"

      android:layout_width="fill_parent"

      android:layout_height="50dip"

      android:orientation="vertical" >

    <TextView android:id="@+id/tv_1" />

    <TextView android:id="@+id/tv_2" />

    </LinearLayout >

    此时,有如下逻辑:

    ListView listView =
    xxxx;


    listView.addHearderView(item_root);


    listView.setAdapter(adapter);

    adapter.add(xxxxx);添加数据


    item_root.setVisibility(View.GONE);

    按道理,最后一句应该可以起到隐藏headerView的目的,但实际效果(魅族MX上测试发现),item_root的地方的确没有控件了,但item_root占用的50dip高度还在,即原来headerView的地方变成了一片空白区域!和View.INVISIBILE效果一样了,汗死!


    继续尝试如下,修改itemView的结构:



    <LinearLayout android:id="@+id/item_root"

     
    android:layout_width="fill_parent"

      android:layout_height="50dip"

      android:orientation="vertical"
    >

    <LinearLayout android:id="@+id/item_container"

    <TextView android:id="@+id/tv_1" />

    <TextView android:id="@+id/tv_2" />

    </LinearLayout>

    </LinearLayout
    >

    此结构较之前的结构增加了一个多余的Layout(item_container)来囊括item内部控件。此时,如果在item_container .setVisibility(View.GONE)则可以完美实现隐藏HeaderView的目的!

    结论:View.GONE属性貌似不作用在根Layout上。



    新的问题:

    如果在item_root上使用了Shape背景,且此背景存在MinSize,那么此方法又失效了。。。

    规避处理:如果的确必须要在HeaderView上添加背景background的话,那么请将background设置在item_container上吧,不要设置在item_root上,如此就可以规避新的问题了。
  • 相关阅读:
    Day 69
    Day 68
    Day 67
    Day 66
    Day 65
    Day 64
    Day 63
    Day 62
    Day 61
    Day 60
  • 原文地址:https://www.cnblogs.com/bmate/p/2672632.html
Copyright © 2011-2022 走看看