当前位置:   article > 正文

AndroidStudio RecyclerView item点击事件及解决RadioButton选中混乱_android recyclerview appcompatradiobutton错乱

android recyclerview appcompatradiobutton错乱

因为时间不够,先整理一些小知识点,最后再统一排版

1 RecyclerView点击事件

  1. //设置点击事件的接口
  2. private Inspection_Switch_One_Level_Adapter.ItemClickListener mItemClickListener;
  3. public interface ItemClickListener {
  4. void onItemClick(int position);
  5. }
  1. public void setOnItemClickListener(Inspection_Switch_One_Level_Adapter.ItemClickListener itemClickListener) {
  2. this.mItemClickListener = itemClickListener;
  3. }

在onBindViewHolder中加入如下代码

  1. if (mItemClickListener != null) {
  2. holder.itemView.setOnClickListener(new View.OnClickListener() {
  3. @Override
  4. public void onClick(View v) {
  5. //if (mEditMode == 1) {
  6. //if (!isSelect.get(position)) {
  7. //holder.ImageView_Switch_Check.setImageResource(R.drawable.ic_checked);
  8. // isSelect.remove(position);
  9. //isSelect.put(position, true);
  10. //} else {
  11. //holder.ImageView_Switch_Check.setImageResource(R.drawable.ic_uncheck);
  12. //isSelect.remove(position);
  13. //isSelect.put(position, false);
  14. //}
  15. //}
  16. //mItemClickListener.onItemClick(position);
  17. }
  18. });
  19. }

2 RecyclerView长按事件

  1. private Inspection_Switch_One_Level_Adapter.OnItemLongClickListener monItemLongClickListener;
  2. public interface OnItemLongClickListener {
  3. void onItemLongClickListener(int position);
  4. }
  5. public void setMonItemLongClickListener(Inspection_Switch_One_Level_Adapter.OnItemLongClickListener monItemLongClickListener) {
  6. this.monItemLongClickListener = monItemLongClickListener;
  7. }
  1. 在onBindViewHolder中加入如下代码:
  2. if (monItemLongClickListener != null) {
  3. holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
  4. @Override
  5. public boolean onLongClick(View v) {
  6. monItemLongClickListener.onItemLongClickListener(position);
  7. //返回值设为true表示消耗了时间不会传递
  8. return true;
  9. }
  10. });
  11. }

3 RecyclerView 滑动之后导致RadioButton错乱的问题

  由于RecyclerView的onBindViewHolder()方法,只有在getItemViewType()返回类型不同时才会调用,这点是跟ListView的getView()方法不同的地方,所以如果想要每次都调用onBindViewHolder()刷新item数据,就要重写getItemViewType(),让其返回position,否则很容易产生数据错乱的现象。
我这是是先用一个HashMap将RadioButton的选中情况与item的position情况存起来 以便后面的调用,然后再重写getItemViewType()方法返回值是position即可保证RadioButton选中情况不发生错乱,

本demo可在日志中完整打印出来结果,便于查看。

下面是代码:
1)适配器的代码:

  1. package com.example.administrator.radiobutton_test_1;
  2. import android.support.v7.widget.RecyclerView;
  3. import android.util.Log;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.RadioButton;
  8. import android.widget.RadioGroup;
  9. import android.widget.TextView;
  10. import java.util.HashMap;
  11. import java.util.List;
  12. /**
  13. * Created by Administrator on 2019/1/9 0009.
  14. */
  15. public class RBandETtest_Adapter extends RecyclerView.Adapter<RBandETtest_Adapter.ViewHolder> {
  16. private List<RBandETtest> mRBandETtestList;
  17. private int layoutPosition;
  18. static class ViewHolder extends RecyclerView.ViewHolder {
  19. RadioGroup radioGroup;
  20. RadioButton radioButton_Yes;
  21. RadioButton radioButton_No;
  22. TextView editText_remark;
  23. public ViewHolder(View view) {
  24. super(view);
  25. radioButton_Yes = (RadioButton) view.findViewById(R.id.RadioButton_Yes);
  26. radioButton_No = (RadioButton) view.findViewById(R.id.RadioButton_No);
  27. radioGroup = (RadioGroup) view.findViewById(R.id.radioGroup);
  28. editText_remark = (TextView) view.findViewById(R.id.editText_remark);
  29. }
  30. }
  31. public RBandETtest_Adapter(List<RBandETtest> RBandETtestList) {
  32. mRBandETtestList = RBandETtestList;
  33. }
  34. @Override
  35. public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  36. View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.rbandettest_item, parent, false);
  37. ViewHolder holder = new ViewHolder(view);
  38. return holder;
  39. }
  40. //0代表否,1代表是,2代表未选择
  41. private static HashMap<Integer, Integer> isSelect = new HashMap<>();
  42. public void iniChossen() {
  43. //这里取反
  44. for (int i = 0; i < mRBandETtestList.size(); i++) {
  45. isSelect.put(i, 2);
  46. }
  47. }
  48. public void setSelectCondition(int position) {
  49. if (b.equals("是")) {
  50. isSelect.remove(position);
  51. isSelect.put(position, 1);
  52. } else if (b.equals("否")) {
  53. isSelect.remove(position);
  54. isSelect.put(position, 0);
  55. } else {
  56. }
  57. }
  58. public HashMap<Integer, Integer> getSelectCondition() {
  59. return isSelect;
  60. }
  61. //设置点击事件的接口
  62. private RBandETtest_Adapter.ItemClickListener mItemClickListener;
  63. public interface ItemClickListener {
  64. void onItemClick(int position);
  65. }
  66. public void setOnItemClickListener(RBandETtest_Adapter.ItemClickListener itemClickListener) {
  67. this.mItemClickListener = itemClickListener;
  68. }
  69. public String returnRadioButtonText() {
  70. String ss = "";
  71. ss = b;
  72. return ss;
  73. }
  74. String b;
  75. // 由于RecyclerView的onBindViewHolder()方法,只有在getItemViewType()返回类型不同时才会调用,
  76. // 这点是跟ListView的getView()方法不同的地方,所以如果想要每次都调用onBindViewHolder()刷新item数据,
  77. // 就要重写getItemViewType(),让其返回position,否则很容易产生数据错乱的现象。
  78. @Override
  79. public int getItemViewType(int position) {
  80. return position;
  81. }
  82. @Override
  83. public void onBindViewHolder(final ViewHolder holder, final int position) {
  84. try {
  85. if (isSelect.get(position) == 0) {
  86. holder.radioButton_No.setChecked(true);
  87. } else if (isSelect.get(position) == 1) {
  88. holder.radioButton_Yes.setChecked(true);
  89. } else {
  90. holder.radioGroup.clearCheck();
  91. }
  92. Log.e("-------------------" + String.valueOf(position), String.valueOf(isSelect.get(position)));
  93. //每一次都要重新加载radioButton的选中值
  94. holder.radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
  95. @Override
  96. public void onCheckedChanged(RadioGroup radioGroup, int i) {
  97. layoutPosition = holder.getLayoutPosition();
  98. mItemClickListener.onItemClick(i);
  99. if (radioGroup.getCheckedRadioButtonId() == R.id.RadioButton_Yes) {
  100. b = "是";
  101. } else if (radioGroup.getCheckedRadioButtonId() == R.id.RadioButton_No) {
  102. b = "否";
  103. } else {
  104. b = "未选择";
  105. }
  106. setSelectCondition(position);
  107. }
  108. });
  109. } catch (Exception e) {
  110. e.printStackTrace();
  111. }
  112. }
  113. @Override
  114. public int getItemCount() {
  115. return mRBandETtestList.size();
  116. }
  117. }

2)布局item代码,很简单只有一组RadioButton,MainActivity中我是循环了150组

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical" android:layout_width="match_parent"
  4. android:layout_height="wrap_content"
  5. >
  6. <RadioGroup
  7. android:layout_width="wrap_content"
  8. android:layout_height="wrap_content"
  9. android:orientation="horizontal"
  10. android:id="@+id/radioGroup">
  11. <RadioButton
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:id="@+id/RadioButton_Yes"
  15. android:text="是"/>
  16. <RadioButton
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. android:id="@+id/RadioButton_No"
  20. android:text="否"/>
  21. </RadioGroup>
  22. </LinearLayout>

3)MainActivity中的代码

  1. package com.example.administrator.radiobutton_test_1;
  2. import android.os.Bundle;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.support.v7.widget.LinearLayoutManager;
  5. import android.support.v7.widget.RecyclerView;
  6. import android.util.Log;
  7. import android.util.SparseBooleanArray;
  8. import android.view.View;
  9. import android.widget.Button;
  10. import java.util.ArrayList;
  11. import java.util.HashMap;
  12. import java.util.List;
  13. public class MainActivity extends AppCompatActivity {
  14. RecyclerView recyclerView;
  15. public List<RBandETtest> rBandETtestList = new ArrayList<>();
  16. RBandETtest_Adapter rBandETtest_adapter;
  17. ArrayList<RBandETtest> selectlist;
  18. Button button;
  19. SparseBooleanArray sparseBooleanArray;
  20. HashMap<Integer,Integer> isSelect;
  21. @Override
  22. protected void onCreate(Bundle savedInstanceState) {
  23. super.onCreate(savedInstanceState);
  24. setContentView(R.layout.activity_main);
  25. recyclerView = (RecyclerView) findViewById(R.id.RecyclerView);
  26. button=(Button)findViewById(R.id.button);
  27. iniData();
  28. selectlist = new ArrayList<>();
  29. LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
  30. recyclerView.setLayoutManager(linearLayoutManager);
  31. rBandETtest_adapter = new RBandETtest_Adapter(rBandETtestList);
  32. recyclerView.setAdapter(rBandETtest_adapter);
  33. rBandETtest_adapter.iniChossen();
  34. rBandETtest_adapter.setOnItemClickListener(new RBandETtest_Adapter.ItemClickListener() {
  35. @Override
  36. public void onItemClick(int position) {
  37. String ss=rBandETtest_adapter.returnRadioButtonText();
  38. }
  39. });
  40. button.setOnClickListener(new View.OnClickListener() {
  41. @Override
  42. public void onClick(View view) {
  43. isSelect=rBandETtest_adapter.getSelectCondition();
  44. String s1="是";
  45. String s2="否";
  46. for (int i = 0; i < isSelect.size(); i++) {
  47. if (isSelect.get(i)==0){
  48. Log.e("--------------"+i, s2 );
  49. }else if (isSelect.get(i)==1){
  50. Log.e("--------------"+i, s1 );
  51. }else {
  52. Log.e("--------------"+i, "未选择" );
  53. }
  54. }
  55. }
  56. });
  57. }
  58. public void iniData() {
  59. for (int i = 0; i < 150; i++) {
  60. RBandETtest rbet = new RBandETtest("123");
  61. rBandETtestList.add(rbet);
  62. }
  63. }
  64. }

4)父布局代码

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. android:id="@+id/activity_main"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:paddingBottom="@dimen/activity_vertical_margin"
  8. android:paddingLeft="@dimen/activity_horizontal_margin"
  9. android:paddingRight="@dimen/activity_horizontal_margin"
  10. android:paddingTop="@dimen/activity_vertical_margin"
  11. tools:context="com.example.administrator.radiobutton_test_1.MainActivity">
  12. <FrameLayout
  13. android:layout_width="match_parent"
  14. android:layout_height="wrap_content">
  15. <android.support.v7.widget.RecyclerView
  16. android:layout_width="match_parent"
  17. android:layout_height="match_parent"
  18. android:id="@+id/RecyclerView" />
  19. </FrameLayout>
  20. <LinearLayout
  21. android:layout_width="match_parent"
  22. android:layout_height="wrap_content"
  23. android:layout_alignParentBottom="true"
  24. android:layout_alignParentLeft="true"
  25. android:layout_alignParentStart="true">
  26. <Button
  27. android:layout_width="match_parent"
  28. android:layout_height="wrap_content"
  29. android:id="@+id/button"
  30. android:text="获取选中项"
  31. android:layout_alignParentBottom="true"
  32. android:layout_alignParentLeft="true"
  33. android:layout_alignParentStart="true" />
  34. </LinearLayout>
  35. </RelativeLayout>

 代码比较简单,是我专门做的一个测试demo,有需要的可以尝试迁移到自己的项目中去,欢迎交流

下面是一个demo的链接

防止RecyclerView滑动出现数据错乱包括RadioButton,EditText

关注+私信,我免费发送给你。

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/733775
推荐阅读
相关标签
  

闽ICP备14008679号