Android-Dialog根据listview的数据量动态改变高度,并且有一个最大的高度
前几天做项目的时候碰到了这样一个问题,首先在Dialog里面放入一个ListView的列表,在显示到某一数量以前,Dialog的高度随着数据量的增加而变高,当数据量超过某一值之后,Dialog的高度不再改变,listView列表额数据上下滑动显示,在网上找了好多资料,但是都不是很好,写的都是不清不楚。
下面的我的讲解都是我自己随手写小例子,加入自己有其他的需要,那么就自己添加吧。
我们知道,在Activity里面放入ListView列表的时候,我们需要用适配器进行适配,把每一条Lsit放入LsitView里面,dialog也是一样的,和Activity一样,也是一样的步骤,在这里我就不多做介绍了。下面是我的例子Dialog跳出来的样子,想自定义的View的可以自己进行复写。本人只是为了介绍高度的动态变化。
布局文件(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(); } });