最近在使用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-12-13 01:56:13