单选模式android_android radiogroup嵌套布局单选模式不生效 - CSDN
精华内容
参与话题
  • 这是一个关于listview多选与单选的demo. 先放demo的下载链接demo传送门 过后补具体内容….

    这是一个关于listview多选与单选的demo.
    先放demo的下载链接demo传送门
    过后补具体内容….

    展开全文
  • Android开发中会遇到将单选按钮排布在多行的情况,一般只能通过自定义控件的形式,绘制单选按钮,网络上也有很多这样的文章,但一般情况下自定义的控件在界面美观性、效果方面稍有欠缺。 因此,我们打算用...

    背景

    Android开发中会遇到将单选按钮排布在多行的情况,一般只能通过自定义控件的形式,绘制单选按钮,网络上也有很多这样的文章,但一般情况下自定义的控件在界面美观性、效果方面稍有欠缺。

    因此,我们打算用CheckBox+LinearLayout来实现一种多行单选按钮组的效果。

    效果如下:

    demo

    思路

    Android中要实现单选按钮要用到RadioGroup+RadioButton的布局结构。

    RadioGroup继承自LinearLayout,只能按单行或单列的形式排布RadioButton组,所以只能通过其他方法来解决。

    RadioButton如果不放置在RadioGroup中,则功能类似于CheckBox,只是不能取消选择。

    鉴于上述两个原因,单选组的实现中使用CheckBox控件,更利于封装和统一,因为封装的方法复选框也可以用。

    单选组

    示例中的单选组采用横向分布形式,第一行使用LinearLayout做横向布局,里面放置5个CheckBox;第二行使用LinearLayout做横向布局,里面放置2个CheckBox。

    布局结构

    • LinearLayout
      • CheckBox
      • CheckBox
      • CheckBox
      • CheckBox
      • CheckBox
    • LinearLayout
      • CheckBox
      • CheckBox

    相关布局xml源码:

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginTop="20dip">
    
        <CheckBox
            android:id="@+id/radio1"
            style="@style/select_style"
            android:tag="rd1"
            android:text="单选1" />
    
        <CheckBox
            android:id="@+id/radio2"
            style="@style/select_style"
            android:tag="rd2"
            android:text="单选2" />
    
        <CheckBox
            android:id="@+id/radio3"
            style="@style/select_style"
            android:tag="rd3"
            android:text="单选3" />
    
        <CheckBox
            android:id="@+id/radio4"
            style="@style/select_style"
            android:tag="rd4"
            android:text="单选4" />
    
        <CheckBox
            android:id="@+id/radio5"
            style="@style/select_style"
            android:tag="rd5"
            android:text="单选5" />
    
    </LinearLayout>
    
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginTop="10dip">
    
        <CheckBox
            android:id="@+id/radio6"
            style="@style/select_style"
            android:tag="rd6"
            android:text="单选6" />
    
        <CheckBox
            android:id="@+id/radio7"
            style="@style/select_style"
            android:tag="rd7"
            android:text="单选7" />
    
    </LinearLayout>
    

    单选控制

    因为CheckBox本身是复选框,如果把一组CheckBox做成单选模式的话需要监听CheckBox的Click事件,这个地方用Click事件更合适一点,因为监听的是“被点击”而不是“值改变”。
    单选控制要在Activity中注册事件:

    /**
     * 单选项点击事件
     * @param checkBox
     */
    @OnClick({R.id.radio1, R.id.radio2, R.id.radio3, R.id.radio4, R.id.radio5, R.id.radio6, R.id.radio7})
    void changeRadios(CheckBox checkBox) {
        CommonUtil.unCheck(radios);
        checkBox.setChecked(true);
    }
    

    说明:

    CommonUtil.unCheck(radios); 取消所有单选组CheckBox的选中状态;

    checkBox.setChecked(true); 设置当前CheckBox选中,因为Radio是不能点击自己取消自己选中状态的,这样比较符合设计逻辑。

    用到了ButterKnife框架赖绑定click事件,对一组View来说,绑定起来比较方便。

    其中:

    CommonUtil.unCheck方法:

    /**
     * 取消checkbox选中状态
     *
     * @param checkBoxList 复选框列表
     */
    public static void unCheck(List<CheckBox> checkBoxList) {
        for (CheckBox chb : checkBoxList) {
            chb.setChecked(false);
        }
    }
    

    获取选中值

    因为单选效果是我们通过CheckBox虚拟出来的,所以按钮的选中值也得做出相应修改,这里定义了一个工具方法:

    /**
     * 获取单选值
     *
     * @param checkBoxList
     * @return String 单选值
     */
    public static String getOne(List<CheckBox> checkBoxList) {
        String tag = "";
        for (CheckBox chb : checkBoxList) {
            if (chb.getTag() == null) {
                continue;
            }
            if (chb.isChecked()) {
                tag = chb.getTag().toString();
                break;
            }
        }
        return tag;
    }
    

    说明:

    CheckBox的值是通过tag属性来取得,在界面布局时给CheckBox已经加上了tag。

    复选组

    Android提供的CheckBox就可以提供复选功能,只是多数情况下我们需要使用一组CheckBox,并获取选中的所有值。

    布局结构

    借鉴单选组的构建方法,复选组的界面xml:

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginTop="20dip">
    
        <CheckBox
            android:id="@+id/checkbox1"
            style="@style/select_style"
            android:tag="chb1"
            android:text="复选1" />
    
        <CheckBox
            android:id="@+id/checkbox2"
            style="@style/select_style"
            android:tag="chb2"
            android:text="复选2" />
    
        <CheckBox
            android:id="@+id/checkbox3"
            style="@style/select_style"
            android:tag="chb3"
            android:text="复选3" />
    
        <CheckBox
            android:id="@+id/checkbox4"
            style="@style/select_style"
            android:tag="chb4"
            android:text="复选4" />
    
        <CheckBox
            android:id="@+id/checkbox5"
            style="@style/select_style"
            android:tag="chb5"
            android:text="复选5" />
    
    </LinearLayout>
    
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginTop="10dip">
    
        <CheckBox
            android:id="@+id/checkbox6"
            style="@style/select_style"
            android:tag="chb6"
            android:text="复选6" />
    
        <CheckBox
            android:id="@+id/checkbox7"
            style="@style/select_style"
            android:tag="chb7"
            android:text="复选7" />
    
    </LinearLayout>
    

    获取选中值

    提前将一系列CheckBox定义到一个集合中,然后通过遍历集合中已选中的CheckBox,就可以获得选中的值了,这里同样将value存放在tag中。

    /**
     * 获取多选值
     *
     * @param checkBoxList
     * @return String 多个值结合,逗号分隔
     */
    public static String getMany(List<CheckBox> checkBoxList) {
        StringBuffer sb = new StringBuffer();
        for (CheckBox chb : checkBoxList) {
            if (chb.getTag() == null) {
                continue;
            }
            if (chb.isChecked()) {
                if (sb.length() > 0) {
                    sb.append(", ");
                }
                sb.append(chb.getTag().toString());
            }
        }
        return sb.toString();
    }
    

    样式美化

    示例中去除了图标,定义了CheckBox的样式select_style:

    <!-- 选择框自定义主题 -->
    <style name="select_style">
        <item name="android:layout_width">60dip</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_marginLeft">4dip</item>
        <item name="android:layout_marginRight">4dip</item>
        <item name="android:paddingTop">4dip</item>
        <item name="android:paddingBottom">4dip</item>
        <item name="android:background">@drawable/select_selector</item>
        <item name="android:button">@null</item>
        <item name="android:gravity">center</item>
        <item name="android:textSize">13sp</item>
        <item name="android:textColor">@drawable/txt_select_selector</item>
    </style>
    

    实际使用过程可通过android:drawableLeft等属性为单选组、复选组添加小图标,满足项目需求。

    Activity源码

    package com.dommy.selectcustom;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.widget.CheckBox;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.dommy.selectcustom.util.CommonUtil;
    
    import java.util.List;
    
    import butterknife.BindView;
    import butterknife.BindViews;
    import butterknife.ButterKnife;
    import butterknife.OnClick;
    
    public class MainActivity extends AppCompatActivity {
        @BindView(R.id.txt_value)
        TextView tvValue; // 选种值
        @BindViews({R.id.radio1, R.id.radio2, R.id.radio3, R.id.radio4, R.id.radio5, R.id.radio6, R.id.radio7})
        List<CheckBox> radios; // 单选组
        @BindViews({R.id.checkbox1, R.id.checkbox2, R.id.checkbox3, R.id.checkbox4, R.id.checkbox5, R.id.checkbox6, R.id.checkbox7})
        List<CheckBox> checkBoxes; // 多选组
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ButterKnife.bind(this);
    
            // 如果有初始状态需要显示,参见:
            // com.dommy.selectcustom.util.CommonUtil.checkOne()
            // com.dommy.selectcustom.util.CommonUtil.checkMany()
        }
    
        /**
         * 单选项点击事件
         * @param checkBox
         */
        @OnClick({R.id.radio1, R.id.radio2, R.id.radio3, R.id.radio4, R.id.radio5, R.id.radio6, R.id.radio7})
        void changeRadios(CheckBox checkBox) {
            CommonUtil.unCheck(radios);
            checkBox.setChecked(true);
    
            // 显示选中项值
            String checkedValues = CommonUtil.getOne(radios);
            tvValue.setText("选中了:" + checkedValues);
        }
    
        /**
         * 复选项点击事件
         * @param checkBox
         */
        @OnClick({R.id.checkbox1, R.id.checkbox2, R.id.checkbox3, R.id.checkbox4, R.id.checkbox5, R.id.checkbox6, R.id.checkbox7})
        void changeCheckBoxs(CheckBox checkBox) {
            // 显示选中项值
            String checkedValues = CommonUtil.getMany(checkBoxes);
            tvValue.setText("选中了:" + checkedValues);
        }
    }
    

    项目源码

    https://github.com/ahuyangdong/SelectCustom

    CSDN下载:
    https://download.csdn.net/download/ahuyangdong/10722882

    最新更新

    想支持Checkbox的自适应布局呈现吗?见最新文章:Android实现自由单选、复选按钮效果+样式美化(二)

    展开全文
  • Android ListView And GridView 单选模式 Android ListView And GridView 单选模式: 自定义TextView 使 ClassItemTextView 具有Checkable 功能 相当于 CheckBox public class ClassItemTextView extends ...

    Android ListView And GridView 单选模式

    Android ListView And GridView 单选模式:


    自定义TextView 使 ClassItemTextView 具有Checkable 功能 相当于 CheckBox

    public class ClassItemTextView extends TextView implements Checkable {
        private boolean mChecked;
        public ClassItemTextView(Context context) {
            super(context);
        }
    
        public ClassItemTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public ClassItemTextView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @Override
        public void setChecked(boolean checked) {
            mChecked = checked;
            setBackgroundDrawable(checked ? getResources().getDrawable(R.drawable.select_item): getResources().getDrawable(R.drawable.default_item));//当选中时呈现绿色
            setTextColor(checked? Color.WHITE:Color.parseColor("#7D7D7D"));
        }
    
        @Override
        public boolean isChecked() {
            return mChecked;
        }
    
        @Override
        public void toggle() {
            setChecked(!mChecked);
        }
    }
    

    Adapter 的写法

    
        /**
         * chooseAdapter
         */
        class ChooseClassAdapter extends BaseAdapter {
            private List<Boolean> booleanList;
            private String[] array;
    
            public ChooseClassAdapter(String[] array) {
                booleanList = new ArrayList<>();
                this.array = array;
            }
    
            @Override
            public int getCount() {
                return array.length;
            }
    
            @Override
            public Object getItem(int position) {
                return array[position];
            }
    
            @Override
            public long getItemId(int position) {
                return position;
            }
    
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                ViewHolder viewHolder;
                if (convertView == null) {
                    convertView = View.inflate(SingleActivity.this, R.layout.choose_class_imte, null);
                    viewHolder = new ViewHolder();
                    viewHolder.classText = (ClassItemTextView) convertView.findViewById(R.id.class_item_choose);
                    convertView.setTag(viewHolder);
                } else {
                    viewHolder = (ViewHolder) convertView.getTag();
                }
                for (int i = 0; i < getCount(); i++) {
                    if (i == 0) {
                        booleanList.add(true);
                    } else {
                        booleanList.add(false);
                    }
    
                }
                viewHolder.classText.setChecked(booleanList.get(position));
                viewHolder.classText.setText(array[position].toString());
    
                return convertView;
            }
    
            /**
             * 匹配选择false
             *
             * @param position
             */
            public void selectPosition(int position) {
                for (int i = 0; i < getCount(); i++) {
                    if (position == i) {// 设置已选位置 (cast)
                        booleanList.set(i, true);
                    } else {
                        booleanList.set(i, false);
                    }
                }
            }
    
            class ViewHolder {
                private ClassItemTextView classText;
            }
        }

    调用方式:

    
    public class SingleActivity extends AppCompatActivity {
        private GridView mListData;
        private String chooseSelect;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            String[] array = new String[]{"高一", "高二", "高三", "一年级", "二年级", "三年级", "四年级", "五年级", "六年级", "七年级", "八年级", "九年级"};
            chooseSelect = "高一";
            mListData = (GridView)findViewById(R.id.nianji_list);
            final ChooseClassAdapter chooseClassAdapter = new ChooseClassAdapter(array);
            mListData.setAdapter(chooseClassAdapter);
            mListData.setChoiceMode(mListData.CHOICE_MODE_SINGLE);
            mListData.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    
                    if (ListView.CHOICE_MODE_SINGLE == mListData.getChoiceMode()) {
                        String str = (String) mListData.getItemAtPosition(position);
                        chooseClassAdapter.selectPosition(mListData.getCheckedItemPosition());
                /*        ToastUtils.showMessage(mListData.getCheckedItemPosition() + "----" + str);*/
                        chooseClassAdapter.notifyDataSetChanged();
                        chooseSelect = str;
                        Toast.makeText(SingleActivity.this,chooseSelect+ "", Toast.LENGTH_SHORT).show();
                    }
                }
            });
        }

    效果如下:
    这里写图片描述

    链接http://download.csdn.net/download/bxllove/10219004


    展开全文
  • Android ListView中点击单行实现RadioButton的单选功能,自定义Item布局文件 需求描述:Android的ListView中,在自定义的...①在包含ListView的layout文件中,将ListView元素属性设置为单选模式android:choiceMode=...

    Android ListView中点击单行实现RadioButton的单选功能,自定义Item布局文件

      需求描述:Android的ListView中,在自定义的Item中添加RadioButton来指示选中的某个单行,要求点击单行而不是RadioButton就触发选择功能。
    ①在包含ListView的layout文件中,将ListView元素属性设置为单选模式android:choiceMode="singleChoice"
     <ListView
                android:id="@+id/lvRegular"
                android:dividerHeight="1px"
                android:layout_width="match_parent"
                android:choiceMode="singleChoice"
                android:layout_height="wrap_content" >
            </ListView>

    ②在ListView对应的Item的布局文件中,RadioButton元素设置不可点击属性android:clickable="false"这样可以屏蔽掉RadioButton的点击就会(取消)勾选的默认动作,
    同时该布局的根元素设置android:descendantFocusability="blocksDescendants"以确保焦点只在根元素上。
    这样就可以点击行实现(取消)勾选功能。
            <RadioButton
                android:id="@+id/regularRadio"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:clickable="false"
                android:layout_gravity="right" />
    
    
    ③最为关键的一步,即实现单选操作功能,在Adapter中实现
    自定义的RegularAdapte继承BaseAdapter,其他方法不写,这里只贴出关键代码getView()
    @Override
    	public View getView(int position, View convertView, ViewGroup parent) {
    		View v;
    		final int mPosition = position;
    		if (convertView == null) {
    			v = mInflater.inflate(R.layout.item_load_fragment_list_car, parent,
    					false);
    		} else {
    			v = convertView;
    		}
    		//Log.v("Regular", position + " " + v.hashCode() + "  " + checkedPosition);
    		Regular r = (Regular) getItem(position);
    		((TextView) v.findViewById(R.id.regularNo)).setText(r.get_ccbh());
    		((TextView) v.findViewById(R.id.regularCph)).setText(r.get_cph());
    		((TextView) v.findViewById(R.id.regularFcsj)).setText(r.get_fcsj());
    		((TextView) v.findViewById(R.id.regularLc)).setText(r.get_lc() + "km");
    		((TextView) v.findViewById(R.id.regularXlmc)).setText(r.get_xlmc());
    		final RadioButton rb = (RadioButton) v.findViewById(R.id.regularRadio);
    		rb.setChecked(mPosition == checkedPosition);
    		//请在xml文件中在根元素设置屏蔽焦点属性,以及在radioButton中设置不可点击事件
    		v.setOnClickListener(new View.OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				if (checkedPosition == mPosition)
    					checkedPosition = -1;
    				else
    					checkedPosition = mPosition;
    				// rb.setChecked(curPosi==checkedPosition);//此行代码可以略去,见最后一行代码
    				// 回传数据给fragment
    				mFragment.onItemClick(checkedPosition);
    				// 下面一行代码非常重要,重新调用getView()刷新可见区域的view,达到动态刷新的目的,不用担心性能问题,
    				// 因为仅仅只是重新填充数据而不会重新绘制view(有这个作判断convertView == null)
    				RegularAdapter.this.notifyDataSetChanged();
    			}
    		});
    		return v;
    	}<pre name="code" class="java">private int checkedPosition = -1;// 用于标识选中的radiobutton 的位置
    //自定义内部接口
    public interface OnItemClickListener{
          void onItemClick(int position);
    }
    实现思路是用一个字段checkedPosition来标识已经选择的单项,position是唯一的,因此记录它即可。
    RegularAdapter.this.notifyDataSetChanged();//这行代码太关键了,有了它,完美解决了RadioButton错乱的问题
                   另外要明白一点的是getView()的执行时机,一般而言当超出屏幕显示范围的项,重新回到显示范围内时,getView()会被执行,这样通过
    rb.setChecked(mPosition == checkedPosition); 来确定RadioButton的状态,由于convertView有了null的判断,达到了复用的目的,getView()方法的执行不会
            带来太大的性能问题,只是重新填充了数据而已,并且convertView还会缓存一部分数据(好像12项)。
    至此,在Adapter中非常简单的实现了单选功能,那么在Activity或者fragment中如何取得选中的行的对象呢?
                   mFragment.onItemClick(checkedPosition);//这是个回调函数,通过它,将当前选中的行的唯一表示position回传给Fragment或Activity,此处mFragment是fragment
    这需要在Adapter中定义一个内部接口,名字随便取,这里为OnItemClickListener接口。
    接下来在Fragment或者Activity中实现该接口,并同样定义属性private int checkedPosition = -1;// 用于标识选中的radiobutton 的位置
    在其实现接口的方法中同步赋值即可。这样就完成了回传功能。
    @Override
    public void onItemClick(int currentPosition) {
    checkedPosition = currentPosition;
    }
    然后就可以Fragment或Activity中这样取得选中行的对象
                Object obj = listview.getItemAtPosition(checkedPosition);//obj需要强制转化为你自定义的对象
    至此,该需求就实现了。
    展开全文
  • android中listView单选

    2015-12-29 09:51:15
    设置ListView为单选模式 android:id="@+id/lv_category" android:choiceMode="singleChoice" android:layout_width="0dp" android:layout_height="match_parent"
  • wqgallery - wqgallery实现类似微信选择照片功能,可以通过相机或相册选择,支持单张裁剪,支持单选模式、支持多选模式。
  • Android ListView 实现Item单选效果

    万次阅读 2015-11-05 17:00:00
    有时候需要列出大量的选择数据,供用户选择,如果直接用布局写一个个CheckBox 的话不是很合理,所以需要在...查了一些资料,发现在加载ListView 的Item布局的根目录中添加一个属性 :`android:descendantFocusab
  • MultiImageSelector:Android仿微信实现多图选择。支持单选和多选两种模式
  • android ListView+CheckBox实现单选

    千次阅读 2017-10-27 16:53:12
    实现思路是用一个list记录每个listview当中每一个item的选中状态,当list中选中与当前选中不一致,将list当中当前位置对应的设为已选,其他位置未选,大概思路是这样的。实现样式: ...import android.app.
  • Android 通过listView+RadioButton实现列表的单选功能  项目里面有个页面需要使用listVIew列表中含有单选按钮,于是就动手写一个,在item中添加了一个RadioButton,运行app后,发现了一个问题,就是在列表中选中了...
  • 转载请标明出处: ...本文出自:【张旭童的博客】一 概述:这篇文章需求来源还是比较简单的,但做的...其实就是 一个普通的列表,实现了单选功能, 效果如图: (不要怪图渣了,我撸了四五遍,公司录出来的GIF就这么
  • Android 实现单选列表

    2012-05-15 08:46:33
    在网上找了很多资料都不全,所以自己写了个。 废话就不多说了。 ...import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; ...
  • Android实现自由单选、复选按钮效果+样式美化已经实现了自由单选、复选效果,但是demo中选择按钮控件没有做到自动换行的自适应布局,本次使用FlexboxLayout来支持自适应布局。 效果如下: 思路 想要实现自适应布局...
  • Android流式布局,支持点击、单选、多选等,适合用于产品标签等,用法采用Adapter模式,和ListView、GridView用法一样!2016/6/26号新添加初始化标签功能,使用非常简单,只要你的Adapter实现OnInitSelectedPosition...
  • listview设置单选模式:mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 当然还有很多其他的模式可以选择,如ListView.CHOICE_MODE_MULTIPLE,默认是ListView.CHOICE_MODE_NONE; 如果这样设置选中一个...
  • 看效果图是不是你想要的 ListView的布局 ... android:choiceMode="singleChoice" android:background="#fff" android:layout_marginTop="5dp" android:id="@+id/listview_template" and
  • RecyclerView实现单选模式

    千次阅读 2017-03-04 22:11:45
    今天项目中遇到列表单选,因为一直对RecyclerView情有独钟,所以打算也用这个控件写,下面是具体实现RadioButton的样式请参考我的另一个博客 自定义RadioButton样式xml中设置比较简单, 这里就不贴上代码了。...
  • 先看效果图,项目中要实现展示得效果,使用的谷歌,要使用1.0.0,高版本是用于AndroidX 官方解释: Note that starting from 1.1.0, the library is expected to use with AndroidX. Please migrate to AndroidX ...
  • 花了几天研究了下鸿扬大神的博客《Android打造任意层级树形控件,考验你的数据结构和设计》,再结合公司项目改造改造,现在做个笔记。 先看看Demo的实现效果。首先看的是多选效果 再看看单选效果图。 ...
  • Android中几种常见的dialog显示格式,话不多说,直接先上图首先是Java代码import android.app.Dialog; import android.content.DialogInterface; import android.support.v7.app.AlertDialog; import android....
1 2 3 4 5 ... 20
收藏数 5,531
精华内容 2,212
关键字:

单选模式android