【问题标题】:Listview checkbox becomes unselected when scroll down向下滚动时,Listview 复选框变为未选中状态
【发布时间】:2023-03-21 09:35:01
【问题描述】:

我创建了一个带有复选框和两行文本的自定义列表视图。我想在单击列表项时更改复选框状态(这意味着如果单击列表项复选框或文本的任何部分,复选框将更改状态)。 为了实现这一点,我在 custom_list_row xml 文件中添加了这个:

<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants" >

<CheckBox
    android:id="@+id/checkbox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:focusable="false"
    android:clickable="false" />

在 java 类中我做了这些:

    listview.setAdapter(adapter);

    listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            final CheckBox checkBox;
            checkBox = (CheckBox)view.findViewById(R.id.checkbox);


            if(checkBox.isChecked()){
                checkBox.setChecked(false);
            }
            else {
                checkBox.setChecked(true);
            }
        }
    });

这很好用。但唯一的问题是,当我选择一些项目并向下滚动时-->返回所选项目-->所选项目变为未选中。

我没有对 setOnCheckedChangeListener 做任何事情

出了什么问题?任何解决此问题的建议都会有所帮助。

谢谢

【问题讨论】:

  • 你需要为此维护布尔数组
  • 你的意思是我必须创建一个数组来保存所有复选框的状态吗?
  • 是的,但是尝试使用recyclerview
  • 与视图无关。只需为所有复选框的状态创建一个 ArrayList。然后在列表视图的单击中将它们的值添加到列表中。在您的适配器中使用该列表后,例如 checkBox.setChecked(arrayList.get(position));

标签: android listview checkbox


【解决方案1】:

请在复选框选中/取消选中时进行更改

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            final CheckBox checkBox;
            checkBox = (CheckBox)view.findViewById(R.id.checkbox);


            if(checkBox.isChecked()){
                checkBox.setChecked(false);

                    // Reset the checkbox in array list/Bean  like 

                    list.set(); // set new value of list 

                    adapter.notifyChange();

            }
            else {
                checkBox.setChecked(true);

                 // Reset the checkbox in array list/Bean  like 

                    list.set(); // set new value of list 

                    adapter.notifyChange();
            }
        }
    });

这个改动解决了我的这个问题。

【讨论】:

    【解决方案2】:

    我建议你需要使用recyclerview

    public class CardViewActivity extends AppCompatActivity {
    
     private Toolbar toolbar;
    
     private RecyclerView mRecyclerView;
     private RecyclerView.Adapter mAdapter;
     private RecyclerView.LayoutManager mLayoutManager;
    
     private List<Student> studentList;
    
     private Button btnSelection;
    
     @Override
     protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      toolbar = (Toolbar) findViewById(R.id.toolbar);
      btnSelection = (Button) findViewById(R.id.btnShow);
    
      studentList = new ArrayList<Student>();
    
      for (int i = 1; i <= 15; i++) {
       Student st = new Student("Student " + i, "androidstudent" + i
         + "@gmail.com", false);
    
       studentList.add(st);
      }
    
      if (toolbar != null) {
       setSupportActionBar(toolbar);
       getSupportActionBar().setTitle("Android Students");
    
      }
    
      mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
    
      // use this setting to improve performance if you know that changes
      // in content do not change the layout size of the RecyclerView
      mRecyclerView.setHasFixedSize(true);
    
      // use a linear layout manager
      mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    
      // create an Object for Adapter
      mAdapter = new CardViewDataAdapter(studentList);
    
      // set the adapter object to the Recyclerview
      mRecyclerView.setAdapter(mAdapter);
    
      btnSelection.setOnClickListener(new OnClickListener() {
    
       @Override
       public void onClick(View v) {
        String data = "";
        List<Student> stList = ((CardViewDataAdapter) mAdapter)
          .getStudentist();
    
        for (int i = 0; i < stList.size(); i++) {
         Student singleStudent = stList.get(i);
         if (singleStudent.isSelected() == true) {
    
          data = data + "\n" + singleStudent.getName().toString();
          /*
           * Toast.makeText( CardViewActivity.this, " " +
           * singleStudent.getName() + " " +
           * singleStudent.getEmailId() + " " +
           * singleStudent.isSelected(),
           * Toast.LENGTH_SHORT).show();
           */
         }
    
        }
    
        Toast.makeText(CardViewActivity.this,
          "Selected Students: \n" + data, Toast.LENGTH_LONG)
          .show();
       }
      });
    
     }
    
    }
    

    更多信息请见http://android-pratap.blogspot.in/2015/01/recyclerview-with-checkbox-example.html

    如果你想使用 listview 试试这种方式

    public class CustomAdapter extends BaseAdapter {
        private final LayoutInflater inflater;
        private final Context context;
        private List<Modelclass> listData;
    
        public CustomAdapter(Context mainActivity, List<Modelclass> listData) {
            context = mainActivity;
            this.listData = listData;
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
    
        @Override
        public int getCount() {
            return listData.size();
        }
    
        @Override
        public Object getItem(int position) {
            return listData.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return 0;
        }
    
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            final ViewHolder holder;
    
            if (convertView == null) {
                holder = new ViewHolder();
                convertView = inflater.inflate(R.layout.list_item_poojaselection, null);
                holder.tv = (TextView) convertView.findViewById(R.id.list_item_poojaname);
                holder.checks = (CheckBox) convertView.findViewById(R.id.list_item_poojacheck);
                convertView.setTag(holder);
            }else {
                holder = (ViewHolder) convertView.getTag();
            }
            holder.checks.setOnCheckedChangeListener(null);
            holder.checks.setFocusable(false);
    
            if (listData.get(position).isselected) {
                holder.checks.setChecked(true);
            } else {
                holder.checks.setChecked(false);
            }
    
            holder.checks.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton cb, boolean b) {
    
                    if (checkMaxLimit()) {
    
                        if (listData.get(position).isselected && b) {
                            holder.checks.setChecked(false);
                            listData.get(position).isselected = false;
    
                        } else {
                            holder.checks.setChecked(false);
                            listData.get(position).isselected = false;
                            Toast.makeText(context, "Max limit reached", Toast.LENGTH_SHORT).show();
                        }
                    } else {
                        if (b) {
                            listData.get(position).isselected = true;
                        } else {
                            listData.get(position).isselected = false;
                        }
                    }
                }
            });
    
            holder.tv.setText(listData.get(position).getLISTING_NAME());
            return convertView;
        }
    
        public boolean checkMaxLimit() {
            int countermax = 0;
            for(Modelclass item : listData){
                if(item.isselected){
                    countermax++;
                }
            }
            return countermax >= 5;
        }
    
        public class ViewHolder {
            TextView tv;
            public CheckBox checks;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      • 2021-02-26
      • 1970-01-01
      相关资源
      最近更新 更多