自适应高度的ListView(限定最大高度)

现在公司的项目有一个需求,需要弹出一个对话框,对话框中的中间内容是一个列表,但是由于是对话框显示,所以显示的内容不能过多,会影响美观。当内容只要1条的时候ListView的高度就是包含1条内容的高度,2条就显示2项对应的高度,但是超过3条和3条以上的时候都只显示3项内容的高度。

图片如下:
自适应高度的ListView(限定最大高度)_第1张图片

现在显示的是出所有的项,需求是但超过三项的时候显示出来三项,其余的滑动出来。
代码如下:
1. ListView的布局 alert_list_content.xml: 高度使用wrap_content,包含所有项的高度。
2. 也可以使用固定的一个高度值,但是那样的话,不管有多少项都只能是固定的高度。但是内容项是变化的,所以不适合。

<ListView
        android:id="@+id/alert_list_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:divider="#00000000"
        android:cacheColorHint="#00000000"
        android:listSelector="@android:color/transparent"
        android:layout_gravity="center"
        android:scrollbars="none"
        >
    ListView>

Dialog中的主要代码:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.alert_listview_dialog);
        ListView  listView = findViewById(R.id.alert_list_content);
        //使用ArrayAdapter
        listView.setAdapter(new ArrayAdapter(mContext      ,android.R.layout.simple_list_item_1, items));
    }

如上代码就会显示出所有的四行。网上很多资料提示如果要固定项高度的话可以重写其适配器Adapter的getCount();返回固定的项,但是那样的话Listview就无法滑动了显示更多的项了。

经过分析,暂时想到两种方法 :
1.第一种比较简单一点,可以通过从设置的Adapter着手,通过获取到Adapter的某一项的高度,和需要显示的item项的个数, 具体代码如下:

private void setListViewHeight(ListView listView){
        ListAdapter  listAdapter = listView.getAdapter(); //得到ListView 添加的适配器
        if(listAdapter == null){
            return;
        }

        View itemView = listAdapter.getView(0, null, listView); //获取其中的一项
 //进行这一项的测量,为什么加这一步,具体分析可以参考 https://www.jianshu.com/p/dbd6afb2c890这篇文章
        itemView.measure(0,0); 
        int itemHeight = itemView.getMeasuredHeight(); //一项的高度
        int itemCount = listAdapter.getCount();//得到总的项数
        LinearLayout.LayoutParams layoutParams = null; //进行布局参数的设置
        if(itemCount <= 3){
            layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT ,itemHeight*itemCount);
        }else if(itemCount > 3){
            layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT ,itemHeight*3);
        }
        listView.setLayoutParams(layoutParams);
    }

把上面这个方法添加到dialog的onCreate()方法中,在ListView绑定完adapter之后添加这个方法。
改过的之后代码如下:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.alert_listview_dialog);
        ListView  listView = findViewById(R.id.alert_list_content);
        //使用ArrayAdapter
        listView.setAdapter(new ArrayAdapter(mContext ,android.R.layout.simple_list_item_1, items));
        setListViewHeight(listView); //把上面的设置方法加到这里
    }

2. 第二种方法是自定义一个ListView,实现以上需求,这种会比较复杂一点,但是封装会更好,扩展性会更好。

你可能感兴趣的:(Android-UI)