RadioGroup嵌套RadioButton 条目显示错乱解决方法

最近在使用ListView中发现在使用,item含RadioGroup嵌套RadioButton时会出现条目显示错乱的问题。

1.  首先想到的是通过bean类,存放RadioButton的状态。保证每一个条目对应集合里面的一条数据。但是修改之后,在下划之后,在上划。还是会显示错乱

       这可咋整?

   按理来说一般条目错乱,只要将变化的数据记录到bean中都没问题(如典型的点赞功能)。 那这里为什么还会出问题呢?

      结合网上的一些资料,最后得出的结论是RadioGroup的状态------其实控件本身已经进行了监听。 如果没有修改这个监听动作,那么当状态改变的时候

      是会调用到系统默认的监听中。 所以在设置数据时需要先移除掉系统这个默认的监听,在设置完数据后,在加上自己的事件监听。这样在滑动过程中

      条目是会先加载数据,在监听事件的改变。

2  接下来看下代码的实现过程:

 (1) 

if (getItem(i).isChecked()){    RadioButton radioButton = (RadioButton) rg_test.getChildAt(getItem(i).getIndex());    radioButton.setChecked(true);}else {    //重点是这里 ---  需要清空RadioGroup中的check状态    rg_test.clearCheck();}

(2)

rg_test = view.findViewById(R.id.rg_test);// 精髓-- 一定要先将RadioGroup中的监听事件设置为null,在设置初始化,最后在设置自己的监听事件.  原因是RadioGroup本身会监听这个事件和//          你设不设定回调没什么关系。 如果你不设置未null,在初始化的过程中会调用系统的回调。导致错乱!!!!rg_test.setOnCheckedChangeListener(null);
public class MainActivity extends AppCompatActivity {

    private BeanTest beanTest;
    private TextView tv_title;
    private RadioGroup rg_test;
    private RadioButton rb_1;
    private RadioButton rb_2;
    private RadioButton rb_3;
    private RadioButton rb_4;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView lv = findViewById(R.id.lv);
        List<BeanTest> list=new ArrayList<BeanTest>();
        initlist(list);

        lv.setAdapter(new MyAdapter(list));

    }

    private List<BeanTest> initlist(List<BeanTest> list) {
      for (int i=0;i<50;i++){
          beanTest = new BeanTest("题目"+i+":","选项--^_^--1","选项--^_^--2","选项--^_^--3","选项--^_^--4",false);
          list.add(beanTest);
         // beanTest.setTitle("");

      }

        return list;
    }

    private class MyAdapter extends BaseAdapter{
        private  List<BeanTest> list=null;

        public MyAdapter(List list) {
            this.list=list;
        }

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

        @Override
        public BeanTest getItem(int i) {
            return list.get(i);
        }

        @Override
        public long getItemId(int i) {
            return i;
        }

        @Override
        public View getView(final int i, View view, ViewGroup viewGroup) {
            if (view==null){
                view= View.inflate(MainActivity.this, R.layout.item_test, null);

            }
            rg_test = view.findViewById(R.id.rg_test);
            // 精髓-- 一定要先将RadioGroup中的监听事件设置为null,在设置初始化,最后在设置自己的监听事件.  原因是RadioGroup本身会监听这个事件和
            //          你设不设定回调没什么关系。 如果你不设置未null,在初始化的过程中会调用系统的回调。导致错乱!!!!
            rg_test.setOnCheckedChangeListener(null);

            tv_title = view.findViewById(R.id.tv_title);
            tv_title.setText(list.get(i).getTitle());

            rb_1 = view.findViewById(R.id.rb_1);
            rb_1.setText(getItem(i).getContent_1());

            rb_2 = view.findViewById(R.id.rb_2);
            rb_2.setText(getItem(i).getContent_2());

            rb_3 = view.findViewById(R.id.rb_3);
            rb_3.setText(getItem(i).getContent_3());

            rb_4 = view.findViewById(R.id.rb_4);
            rb_4.setText(getItem(i).getContent_4());

            if (getItem(i).isChecked()){
                RadioButton radioButton = (RadioButton) rg_test.getChildAt(getItem(i).getIndex());
                radioButton.setChecked(true);
            }else {
                //重点是这里 ---  需要清空RadioGroup中的check状态
                rg_test.clearCheck();
            }

            rg_test.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(RadioGroup radioGroup, int x) {
                    Log.e("gzm","gzm----"+x);
                    switch (x){
                        case R.id.rb_1:
                            getItem(i).setIndex(0);
                            getItem(i).setChecked(true);
                            break;
                        case R.id.rb_2:
                            getItem(i).setIndex(1);
                            getItem(i).setChecked(true);
                            break;
                        case R.id.rb_3:
                            getItem(i).setIndex(2);
                            getItem(i).setChecked(true);
                            break;
                        case R.id.rb_4:
                            getItem(i).setIndex(3);
                            getItem(i).setChecked(true);
                            break;
                        default:
                            break;
                    }
                }
            });
            return view;
        }
    }
}


 public  class BeanTest {
    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public BeanTest(String title) {
        this.title = title;
    }

    public BeanTest(String title, String content_1, String content_2, String content_3, String content_4,boolean isChecked) {
        this.title = title;
        this.content_1 = content_1;
        this.content_2 = content_2;
        this.content_3 = content_3;
        this.content_4 = content_4;
        this.isChecked=isChecked;
    }

    String title;

    public String getContent_1() {
        return content_1;
    }

    public void setContent_1(String content_1) {
        this.content_1 = content_1;
    }

    public String getContent_2() {
        return content_2;
    }

    public void setContent_2(String content_2) {
        this.content_2 = content_2;
    }

    public String getContent_3() {
        return content_3;
    }

    public void setContent_3(String content_3) {
        this.content_3 = content_3;
    }

    public String getContent_4() {
        return content_4;
    }

    public void setContent_4(String content_4) {
        this.content_4 = content_4;
    }

    String content_1;
    String content_2;
    String content_3;
    String content_4;

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    public boolean isChecked() {
        return isChecked;
    }

    public void setChecked(boolean checked) {
        isChecked = checked;
    }

    int index;
   private boolean isChecked;

}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv_title"
        android:text="测试标题"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <RadioGroup
        android:id="@+id/rg_test"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <RadioButton
            android:id="@+id/rb_1"
      android:layout_width="match_parent"
      android:layout_height="wrap_content" />

        <RadioButton
            android:id="@+id/rb_2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
        <RadioButton
            android:id="@+id/rb_3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
        <RadioButton
            android:id="@+id/rb_4"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </RadioGroup>

</LinearLayout>

实现效果:测试后发现可以解决条目错乱问题.

时间: 2024-10-10 02:12:48

RadioGroup嵌套RadioButton 条目显示错乱解决方法的相关文章

eclipse的数字标点错乱解决方法

今天用eclipse的时候,出现了一个小问题.数字变成了标点,标点变成了数字,比如我左shift+2 结果出来是双引号,而shift+“显示@.当然这个简单,只要重启eclipse就行了,但是总有些时候eclipse有服务器在跑,不想关. 这时候一般有三种解决情况. 1.输入法问题,我碰到这个就是.默认输入法才有问题,切换成百度输入是木有问题的,那就切吧.搞定 2.Numlock,查看Numlock灯是否亮着,切换状态再试一下.小键盘的问题在laptop碰到居多 3.shift键被按死.键盘有点

python_java_selenium_ jenkins持续集成Firfox_chrome浏览器不显示的解决方法?

python_java_selenium_ jenkins持续集成Firfox_chrome浏览器不显示的解决方法: 原因:因为jenkins是用windows installer 安装成 windows的服务了,那么jenkins是计算机服务理的一个后台服务,所以跑cases 的时候不显示浏览器 解决办法:1.我们需要关掉jenkins后台服务,让他从cmd(dos窗口)启动,类似于tomcat的手动启动下面的方法适合不用tomcat的同学(注意,用也可以配置好Tomcat放在webapp下启

thinkphp内置截取字符串函数无法显示省略号解决方法

thinkphp内置截取字符串函数无法显示省略号解决方法 functions.php function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true){ if(function_exists("mb_substr")) {      if($suffix)    {         if($str==mb_substr($str, $start, $length, $charset))

采集百度搜寻结果,图片不显示的解决方法

1.根据关键字采集百度搜寻结果 根据关键字采集百度搜寻结果,可以使用curl实现,代码如下: <?php function doCurl($url, $data=array(), $header=array(), $timeout=30){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_R

c#写入Mysql中文显示乱码 解决方法 z

mysql字符集utf8,c#写入中文后,全部显示成?,一个汉字对应一个? 解决方法:在数据库连接字符串中增加字符集的说明,Charset=utf8,如 MySQLConnection con = new MySQLConnection("server=127.0.0.1;uid=root;pwd=;database=test;Charset=utf8"); 搞定 c#写入Mysql中文显示乱码 解决方法 z,布布扣,bubuko.com

【cocos2dx】rapidjson使用方法以及中文显示的解决方法【续】

上一个博客讲了怎么用rapidjson读取中文字符串,但是有一个很明显的缺陷 就是不能直接读取数据编辑器导出的数据.下面我们来修复这个bug并且将代码精简到不到原来的一半大小. 上一博客的地址是:[cocos2dx]rapidjson使用方法以及中文显示的解决方法 不多说 直接上源码吧: 首先,数据编辑器导出的格式是: [{"id":1,"content":"再次按下返回键退出游戏"},{"id":2,"conten

QTP录制后弹出框一个或多个ActiveX控件无法显示的解决方法

制一段脚本代码,在专家视图窗口中编辑录制的脚本代码时,会碰到弹出一个对话窗口,提示为"当前安全设置禁止运行该页中的ActiveX 控件,因此,该页可能无法正常显示"类似的东西,而在人工操作时却没有这样的现象.(如图) 问题主要出在于QTP设置本身,之所以在编辑录制好的脚本时,QTP出现关于Active的对话提示窗口,问题在于QTP的设置,要消除该提示窗口.应对QTP作如下设置:toos–options–Active Screen–Advanced–点选Load ActiveX cont

div css每行文字显示一半 同时文字字体重叠显示不全解决方法

CSS DIV布局中出现单行或多行文字的每行文字内容不能显示全,上下行文字有一点点重叠现象,文字字体只显示一半解决方法,在低版本IE特别明显文字字体显示不全,在谷歌浏览器等高版本IE浏览器测试还好些. 新手布局时候特别爱出现DIV盒子里文字字体显示不完整,音乐沙发甚至上下行文字有一点重叠现象. css字体文字重叠显示不完整重叠字体字体文字重叠显示不完整同时有重叠重合效果截图 在DIV+CSS布局中造成这种字体显示不全,音乐沙发显示一半同时多行文字有一点点重叠情况原因:css行高小于CSS字体大小

dedecms织梦系统后台验证码图片不显示的解决方法

网站迁移后,dedecms织梦系统后台验证码图片不显示的解决方法通用解决方案-取消后台验证码功能因为没有验证码,不能进后台,所以修改php文件源代码:方法一:打开dede/login.php 找到如下代码    if(($validate=='' || $validate != $svali) && preg_match("/6/",$safe_gdopen)){        ResetVdValue();        ShowMsg('验证码不正确!','logi