Android使用RadioButton结合ListView显示对话框单选按钮列表

来源:互联网 发布:淘宝好看的女鞋店铺 编辑:程序博客网 时间:2024/04/29 09:55

Android使用RadioButton结合ListView显示对话框单选按钮列表

有时候对话框的单选按钮列表不能满足我们的的设计需求,因为有时候按钮右边不一定是文字,有可能是文件加图片,或多个文字字段的一行内容,这时我们就需要自定义来解决了。

普通单选的效果:

s1

自定义的效果:

s2

本文中介绍的示例效果:

这里写图片描述

自定义的单选列表数据设计是由ListView的条目构成的,一行数据可以设计成很复杂的内容,比如多张图片或分行显示等等。

设计思想:ListView里面的条目布局左边(或者可以在右边)放一个RadioButton控件,右边设计放文本或图片,可以多个。

还有一个有点复杂的设计的是要判断每一行只有一个RadioButton能被选中,其实是在点击的时候先把每一行的按钮的属性设置为不被选中,然后再把点击的那个按钮的属性设置为选中,这样每次就能保证不会有两个RadioButton被选中。

贴一下主要代码:

(一)ListView的条目的布局设计代码

<?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="80dp"              android:paddingBottom="10dp"              android:paddingTop="10dp"        >    <RadioButton            android:id="@+id/rb"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center_vertical"            />    <TextView            android:id="@+id/tv_info"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_gravity="center_vertical"            android:text="info"            android:textSize="25sp"            />    <ImageView            android:id="@+id/iv_picture"            android:layout_width="100dp"            android:layout_height="match_parent"            android:scaleType="center"            /></LinearLayout>

(二)Adapter类中判断所有行只能有一行的RadioButton按钮被选中。

//用于记录每个RadioButton的状态,并保证只可选一个 public HashMap<Integer, Boolean> states = new HashMap<Integer, Boolean>();  //在这里要做判断保证只有一个RadioButton被选中        //当RadioButton被选中时,将其状态记录进States中,并更新其他RadioButton的状态使它们不被选中        viewHolder.rb.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //把所有的按钮的状态设置为没选中                for (int i = 0; i < getCount(); i++) {                    states.put(i, false);                }                //然后设置点击的那个按钮设置状态为选中                states.put(position, true);    //这样所有的条目中只有一个被选中!                notifyDataSetChanged();//刷新适配器            }        });        //上面是点击后设置状态,但是也是需要设置显示样式,通过判断状态设置显示的样式        if (states.get((Integer) position) == null || states.get((Integer) position) == false) {  //true说明没有被选中            viewHolder.rb.setChecked(false);        } else {            viewHolder.rb.setChecked(true);        }

三.显示对话框方法的代码

    // 使用对话框内的控件来关闭对话框    private void getSignatureDialog() {        // View        final View view = View.inflate(this, R.layout.dialog_signature, null);        ListView lv_signature = (ListView) view.findViewById(R.id.lv_signature);        Button btn_yes = (Button) view.findViewById(R.id.btn_yes);        Button btn_no = (Button) view.findViewById(R.id.btn_no);        final View listviewLayout = View.inflate(this, R.layout.dialog_signature, null);        //List        List<SignatureBean> signatureList = new ArrayList<SignatureBean>();        final String[] info = {"张三", "李四", "王五", "赵六"};        final int[] pictureID = {R.drawable.ic_launcher, R.drawable.sig, R.drawable.signature, R.drawable.sort1};        for (int i = 0; i < info.length; i++) {            signatureList.add(new SignatureBean(info[i], pictureID[i]));        }        //adapter        final SignatureAdapter adapter = new SignatureAdapter(this, signatureList);        lv_signature.setAdapter(adapter);        // 创建对话框对象        final AlertDialog dialog = new AlertDialog.Builder(this).                // 设置标题//                        setTitle("通过按钮关闭对话框").                        // 添加输入的文本框                        setView(view).                // 产生                        create();        // 设置对话框不可以关闭,一般情况下对话框是失去焦点后自动消失的        // 但是加 了.setCancelable(false),对话框就不会消失,除非手动退出        dialog.setCancelable(false);        // 显示        dialog.show();        //设置View内的点击事件        btn_yes.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {//                Toast.makeText(MyActivity.this, "点击了确定", Toast.LENGTH_SHORT).show();                for (int i = 0; i < info.length; i++) {                    if (adapter.states.get(i) != null && (adapter.states.get(i))) {                        imageView.setImageResource(pictureID[i]);                    }                }                dialog.dismiss();            }        });        btn_no.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                // 点击后关闭对话框,两种方法都可以                //  dialog.cancel();                dialog.dismiss();//                Toast.makeText(MyActivity.this, "点击了取消", Toast.LENGTH_SHORT).show();            }        });    }

其他的代码大家可以思考一下,这里也提供一下我的源代码:

http://download.csdn.net/detail/wenzhi20102321/9820636

如果你的页面有多个对话框最好统一一下颜色,系统的对话框标题字体颜色是:#33B5E5,标题下面那条横线的颜色也是这个。

当然这个UI界面如果要用到程序中是需要设计好看一一点的,比如字体的颜色大小,按钮的背景选择等等设置,我这里只是我开发项目测试的一个小Demo,很多数据要和项目主题对应,需要自己慢慢改。

对于android对话框的使用总结,我之前也是有个详细的总结,包括各种列表的对话框,各种进度条的对话框,各种时间、日期选中的对话框的使用都有,大家可以借鉴。

http://blog.csdn.net/wenzhi20102321/article/details/52818351

共勉:再艰难的时刻总有过去的时候。

1 0
原创粉丝点击