繁体   English   中英

在检查时从数组列表中删除元素,然后取消选中复选框列表视图的复选框

[英]Remove element from arraylist on checking and then unchecking the checkbox of checkbox listview

我有一个动态复选框列表视图。 在选择多个复选框时,我得到了正确的数组列表,但是当我一个一个地选中两个复选框然后取消选中一个复选框时,它应该选中一个复选框,但它正在选中前一个选中的两个复选框。

        rd_student.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                String value=objects.get(position).getUserName();
                dbs=new DataBeanStudent();
                //is chkIos checked?
                if (((CheckBox) v).isChecked()) {
                    if (stringArray.contains(value)){
                        Toast.makeText(context, "Already added", Toast.LENGTH_SHORT).show();
                    }else{
                        Toast.makeText(context, "Added", Toast.LENGTH_SHORT).show();
                        stringArray.add(value);
                        selectedStrings.add(value);
                        dbs.setUserName(value);
                        studentArray.add(dbs);
                        saveDataInSP(stringArray, finalV, studentArray);
                    }
                }else
                {
                    if (stringArray.contains(value)){
                        selectedStrings.remove(value);
                        stringArray.remove(value);
                        studentArray.remove(value);
                        Toast.makeText(context, "Removed", Toast.LENGTH_SHORT).show();
                    }else{
                        Toast.makeText(context, "Already Removed", Toast.LENGTH_SHORT).show();
                    }
                }

            }
        });

对于 arraylist,我有一种方法getSelectedString()并且在取消选择复选框后我没有得到正确的列表。

    ArrayList<String> getSelectedString(){
     return selectedStrings;
    }

saveDataInSP(ArrayList<String> stringArray, View view, ArrayList<DataBeanStudent> studentArray)调用getSelectedString() saveDataInSP(ArrayList<String> stringArray, View view, ArrayList<DataBeanStudent> studentArray)

  private void saveDataInSP(ArrayList<String> stringArray, View view, ArrayList<DataBeanStudent> studentArray)
{
    Gson gson = new GsonBuilder().create();
    JsonArray myCustomArray = gson.toJsonTree(stringArray).getAsJsonArray();
    JsonArray studentArray1 = gson.toJsonTree(studentArray).getAsJsonArray();

    stringArray = getSelectedString();
    Log.e("stringarray",stringArray.toString());
    String jsonText = gson.toJson(stringArray);

    sp_dairy = view.getContext().getSharedPreferences(PREFS_DAIRY, 0);
    se_dairy = sp_dairy.edit();
    se_dairy.clear();
    se_dairy.putString("dairy", ""+myCustomArray);
    se_dairy.putString("studentArray", ""+studentArray1);
    se_dairy.putString("string_array", ""+jsonText);
    se_dairy.commit();

}

检查下图。

 ![Screenshot][1]
 ![Screenshot][2]
 ![Screenshot][3]
 ![Screenshot][4]

不要将 OnClickListener 用于 Checkbox,请使用 OnCheckedChangeListener。

rd_student.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            String value=objects.get(position).getUserName();
            dbs=new DataBeanStudent();
            //is chkIos checked?
            if (isChecked) {
                if (stringArray.contains(value)){
                    Toast.makeText(context, "Already added", Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(context, "Added", Toast.LENGTH_SHORT).show();
                    stringArray.add(value);
                    selectedStrings.add(value);
                    dbs.setUserName(value);
                    studentArray.add(dbs);
                    saveDataInSP(stringArray, finalV, studentArray);
                }
            }else
            {
                if (stringArray.contains(value)){
                    selectedStrings.remove(value);
                    stringArray.remove(value);
                    studentArray.remove(value);
                    Toast.makeText(context, "Removed", Toast.LENGTH_SHORT).show();
                }else{
                    Toast.makeText(context, "Already Removed", Toast.LENGTH_SHORT).show();
                }
            }

        }
    });

同样,当我们使用 ListView 或 RecyclerView 时,子视图会被回收。 因此,请始终将其包含在您的适配器中,在上述代码之后。 (假设上面的代码也在适配器中。)

if(stringArray.contains(value))
    rd_student.setChecked(true);
else
    rd_student.setChecked(false);

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM