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

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

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

普通单选的效果:

Android使用RadioButton结合ListView显示对话框单选按钮列表_第1张图片

自定义的效果:

Android使用RadioButton结合ListView显示对话框单选按钮列表_第2张图片

本文中介绍的示例效果:

Android使用RadioButton结合ListView显示对话框单选按钮列表_第3张图片

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

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

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

贴一下主要代码:

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



<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 states = new HashMap();  //在这里要做判断保证只有一个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 signatureList = new ArrayList();
        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

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

你可能感兴趣的:(android,UI)