自适应高度的ListView(限定最大高度)
现在公司的项目有一个需求,需要弹出一个对话框,对话框中的中间内容是一个列表,但是由于是对话框显示,所以显示的内容不能过多,会影响美观。当内容只要1条的时候ListView的高度就是包含1条内容的高度,2条就显示2项对应的高度,但是超过3条和3条以上的时候都只显示3项内容的高度。
图片如下:
现在显示的是出所有的项,需求是但超过三项的时候显示出来三项,其余的滑动出来。 代码如下: 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<String>(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<String>(mContext ,android.R.layout.simple_list_item_1, items)); setListViewHeight(listView); //把上面的设置方法加到这里 }
2. 第二种方法是自定义一个ListView,实现以上需求,这种会比较复杂一点,但是封装会更好,扩展性会更好。