Android实现Dialog嵌套ListView

1、定义ListViewDialog和xml文件

list_view.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="450dp"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/txt_cancel"
        android:orientation="vertical">
        <View
            android:layout_width="fill_parent"
            android:layout_height="2dp"
            android:background="#cccccc" />

        <ListView
            android:id="@+id/lv_remain_item"
            android:layout_width="fill_parent"
            android:layout_height="match_parent"
            android:cacheColorHint="#00000000" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:gravity="center"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/txt_cancel"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:gravity="center"
            android:text="cancel"
            android:textSize="25sp" />
    </LinearLayout>
</LinearLayout>
ListViewDialog

public class ListViewDialog extends Dialog {

    private final Context mContext;
    private ListView mListView;
    private TextView tvCancle;

    public ListViewDialog(Context context) {
        super(context);
        mContext = context;
        initView();
    }

    private void initView() {
        View contentView = View.inflate(mContext, R.layout.list_view, null);
        mListView = (ListView) contentView.findViewById(R.id.lv_remain_item);
        tvCancle=contentView.findViewById(R.id.txt_cancel);
        setContentView(contentView);
    }


    public TextView getTvCancle() {
        return tvCancle;
    }

    public void setTvCancle(TextView tvCancle) {
        this.tvCancle = tvCancle;
    }

    public ListView getmListView() {
        return mListView;
    }

    public void setmListView(ListView mListView) {
        this.mListView = mListView;
    }
}

2、设置适配器

public class ScaleUserAdapter extends BaseAdapter {
    private Context context;
    private List<String> list;

    public ScaleUserAdapter(Context context) {
        setContext(context);

    }

    @Override
    public int getCount() {
        return getList() == null ? 0 : getList().size();
    }

    @Override
    public String getItem(int i) {
        return getList() == null ? null : getList().get(i);
    }
    @Override
    public long getItemId(int i) {
        return i;
    }

    static class ViewHolder {
        public TextView userNameTextView;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {
        ViewHolder viewHolder;
        if (null == convertView) {
            viewHolder = new ViewHolder();
            convertView = View.inflate(getContext(), R.layout.setting_mydevice_hs5_delete_item, null);
            viewHolder.userNameTextView = (TextView) convertView.findViewById(R.id.tv_shortcut_text);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        if (null != list) {
            viewHolder.userNameTextView.setText(list.get(position));
        } else {
            viewHolder.userNameTextView.setText("");
        }
        return convertView;
    }

    public Context getContext() {
        return context;
    }

    public void setContext(Context context) {
        this.context = context;
    }
    public List<String> getList() {
        return list;
    }
    public void setList(List<String> list) {
        this.list = list;
    }
}
适配器布局文件 setting_mydevice_hs5_delete_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/tv_shortcut_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="20dp"
        android:gravity="left"
        android:textColor="#ff000000"
        android:textSize="20sp" />

</RelativeLayout>

3、设置适配器的高度,不设置可能会出现BUG


public class SetHeight {

    public void setListViewHeightBasedOnChildren(ListView listView, BaseAdapter adapter) {

        if (adapter==null){
            return;
        }
        int totalHeight = 0;

        for (int i = 0; i < adapter.getCount(); i++) { // listAdapter.getCount()返回数据项的数目

            View listItem = adapter.getView(i, null, listView);

            listItem.measure(0, 0); // 计算子项View 的宽高

            totalHeight += listItem.getMeasuredHeight(); // 统计所有子项的总高度

        }

        ViewGroup.LayoutParams params = listView.getLayoutParams();

        params.height = totalHeight
                + (listView.getDividerHeight() * (adapter.getCount() - 1));

        // listView.getDividerHeight()获取子项间分隔符占用的高度

        // params.height最后得到整个ListView完整显示需要的高度

        listView.setLayoutParams(params);

    }

}

4、调试Dialog嵌套ListView

public class MainActivity extends AppCompatActivity {
    private ScaleUserAdapter scaleUserAdapter;
    private SetHeight SetHeight;
	private List<String> reslist;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SetHeight =new SetHeight();
        scaleUserAdapter = new ScaleUserAdapter(MainActivity.this);
        reslist = new ArrayList<>();
// 初始化控件属性 设置参数 绑定事件
        final ListViewDialog userListDialog = new ListViewDialog(MainActivity.this);
        userListDialog.setCancelable(true);
        userListDialog.setTitle("识别结果");
        userListDialog.getTvCancle().setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                userListDialog.dismiss();
            }
        });
        scaleUserAdapter.setList(reslist);
        userListDialog.getmListView().setAdapter(scaleUserAdapter);
        SetHeight.setListViewHeightBasedOnChildren(userListDialog.getmListView(),scaleUserAdapter);
        userListDialog.getmListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Log.d("mouse",position+"");
            }

        });
        userListDialog.show();        
	}

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值