现在公司的项目有一个需求,需要弹出一个对话框,对话框中的中间内容是一个列表,但是由于是对话框显示,所以显示的内容不能过多,会影响美观。当内容只要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,实现以上需求,这种会比较复杂一点,但是封装会更好,扩展性会更好。