Android-Dialog根据listview的数据量动态改变高度,并且有一个最大的高度

前几天做项目的时候碰到了这样一个问题,首先在Dialog里面放入一个ListView的列表,在显示到某一数量以前,Dialog的高度随着数据量的增加而变高,当数据量超过某一值之后,Dialog的高度不再改变,listView列表额数据上下滑动显示,在网上找了好多资料,但是都不是很好,写的都是不清不楚。

  下面的我的讲解都是我自己随手写小例子,加入自己有其他的需要,那么就自己添加吧。

  我们知道,在Activity里面放入ListView列表的时候,我们需要用适配器进行适配,把每一条Lsit放入LsitView里面,​dialog也是一样的,和Activity一样,也是一样的步骤,在这里我就不多做介绍了。下面是我的例子Dialog跳出来的样子,想自定义的View的可以自己进行复写。本人只是为了介绍高度的动态变化。

Android-Dialog根据listview的数据量动态改变高度,并且有一个最大的高度

​布局文件(Item的布局):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center">
    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="咚 咚 咚 咚 咚 咚 咚"
        android:gravity="center"
        android:textSize="17sp" />
</LinearLayout>

Dialog布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="wrap_content"
    android:layout_height="wrap_content">
<LinearLayout
    android:orientation="horizontal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <ListView
        android:id="@+id/lv_dialog"
        android:layout_width="wrap_content"
        android:layout_height="372dp"
        android:divider="@color/colorAccent"
        android:dividerHeight="0.5dp"/>
</LinearLayout>
    <LinearLayout
        android:orientation="horizontal"
        android:layout_marginLeft="10dp"
        android:gravity="center"
        android:layout_marginTop="5dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <Button
            android:id="@+id/bt_select"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="20sp"
            android:text="确认"/>
    </LinearLayout>
</LinearLayout>

适配器:

public class DialogAdapter extends BaseAdapter {
    List<Map<String,Object>> data;
    private LayoutInflater mInflate=null;
    public DialogAdapter(Context context, List<Map<String,Object>> data){
        this.data=data;
        this.mInflate=LayoutInflater.from(context);
    }
    static class ViewHolder{
        public TextView textview;
    }
    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder=null;
        if (convertView==null){
            holder=new ViewHolder();
            convertView = mInflate.inflate(R.layout.lv_item, null);
            holder.textview= (TextView) convertView.findViewById(R.id.tv);
            convertView.setTag(holder);
        }else{
            holder= (ViewHolder) convertView.getTag();
        }
        holder.textview.setText((String) data.get(position).get("tvcommodityname"));
        return convertView;
    }
}
dialog复写:

public class MyDialog extends Dialog {
    private Context context;
//    private static Dialog mDialog=null;

    public MyDialog(Context context) {
        super(context);
        this.context=context;
        init();
    }
    ListView lv;
    Button bt;

    private void init() {
        View view= LayoutInflater.from(context).inflate(R.layout.dialog,null);
        lv= (ListView) view.findViewById(R.id.lv_dialog);
        bt= (Button) view.findViewById(R.id.bt_select);
        setContentView(view);
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });
        //Dialog高度可变的核心代码
        final LinearLayout.LayoutParams lpListView = (LinearLayout.LayoutParams) lv.getLayoutParams();
        DialogAdapter dialogAdapter=new DialogAdapter(context,MyDialog.getData());
        if (dialogAdapter.getCount()>=7){//根据可显示的Item的条数进行判断,不能通过高度
            //这里我们定义了一个工具类SizeUtil,我们自代码里设置的高度和宽度的数值都是px单位的,所以需要把dp和sp转换成px在进行计算
            lpListView.height=SizeUtil.dip2px(context,288)-SizeUtil.sp2px(context,28);//这里的数值可以根据自己的内容进行计算
            lpListView.width=SizeUtil.dip2px(context,250);
        }else{
            lpListView.height= WindowManager.LayoutParams.WRAP_CONTENT;
            lpListView.width=SizeUtil.dip2px(context,250);
        }
        //在这里我们要先限定ListView的宽高,在限定Dialog的高宽,具体的原因我也没搞明白????
        lv.setAdapter(dialogAdapter);
        Window dialogWindow =getWindow();
        WindowManager.LayoutParams lp = dialogWindow.getAttributes();
        lp.width=SizeUtil.dip2px(context,300);
        dialogWindow.setAttributes(lp);
        dialogWindow.setGravity(Gravity.CENTER);
    }
    private static List<Map<String, Object>> getData() {
        List<Map<String,Object>> list = new ArrayList<Map<String, Object>>();
        Map<String, Object> map;
        for (int i = 0; i < 88; i++) {
            map = new HashMap<String, Object>();
            map.put("tvcommodityname", "什么也不知道");
            list.add(map);
        }
        return list;
    }
    public MyDialog(Context context, int themeResId) {
        super(context, themeResId);
    }

    protected MyDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {
        super(context, cancelable, cancelListener);
    }
}
MainActivity调用:

btdialog.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        MyDialog myDialog=new MyDialog(MainActivity.this);
        myDialog.show();
    }
});