Listview项目在开始时已选中复选框

时间:2019-06-27 09:39:15

标签: android listview checkbox

我有一个带listView的片段。

从远程接收的JSON数组填充视图,如下所示:

private void callVolley(){



        SharedPreferences prefs3 =
                getActivity().getSharedPreferences(MIEXAMEN, Context.MODE_PRIVATE);

        final String id_materia= "42";
        final String num_examen= "787878";
        pDialog = new ProgressDialog(getActivity());
        pDialog.setMessage("Cargando temas de la materia seleccionada...");
        showDialog();


        JsonArrayRequest jArr = new JsonArrayRequest(url+"?id="+id_materia, new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                Log.d(TAG, response.toString());
                hideDialog();




                // Parsing json
                for (int i = 0; i < response.length(); i++) {
                    try {
                        JSONObject obj = response.getJSONObject(i);

                        Data item = new Data();

                        item.setMenu(obj.getString(TAG_NOMBRE));
                        item.setId(obj.getString(TAG_ID));


                        itemList.add(item);



                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }

                // list.invalidateViews();
                adapter.notifyDataSetChanged();



            }
        }, new Response.ErrorListener() {

            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d(TAG, "Error: " + error.getMessage());
                hideDialog();
            }
        });


        AppController.getInstance().addToRequestQueue(jArr);
    }

然后我以编程方式向每个列表项添加一个复选框。 这是适配器:

 public class Adapter extends BaseAdapter {

    private Context activity;
    private ArrayList<Data> data;
    private static LayoutInflater inflater = null;
    private View vi;
    private ViewHolder viewHolder;

    public Adapter(Context context, ArrayList<Data> items) {
        this.activity = context;
        this.data = items;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int i) {
        return i;
    }

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

    @Override
    public View getView(int position, View view, ViewGroup viewGroup) {
        vi = view;
        final int pos = position;
        Data items = data.get(pos);

        if(view == null) {
            vi = inflater.inflate(R.layout.list_row, null);
            viewHolder = new ViewHolder();
            viewHolder.checkBox = (CheckBox) vi.findViewById(R.id.cb);
            viewHolder.menu = (TextView) vi.findViewById(R.id.nama_menu);
            vi.setTag(viewHolder);
        }else {
            viewHolder = (ViewHolder) view.getTag();

        }
        viewHolder.menu.setText(items.getMenu());
        if(items.isCheckbox()){
            viewHolder.checkBox.setChecked(true);
        } else {
            viewHolder.checkBox.setChecked(false);
        }

        return vi;
    }

    public ArrayList<Data> getAllData(){
        return data;
    }

    public void setCheckBox(int position){
        Data items = data.get(position);
        items.setCheckbox(!items.isCheckbox());
        notifyDataSetChanged();
    }

    public class ViewHolder{
        TextView menu;
        CheckBox checkBox;
    }
}

开始时,我需要选中所有复选框。

然后用户可以选中/取消选中所需的项目。

在片段上有一个读取所有项目复选框状态的按钮。

我应该采取什么措施使所有项目处于检查状态,以便在单击按钮时将所有项目识别为已检查?

这是一开始的屏幕快照,未选中所有项目: enter image description here

编辑

片段中onClickListener按钮的代码:

 fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                checkbox = "";
                checkbox_id = "";

                for (Data hold : adapter.getAllData()) {
                    if (hold.isCheckbox()) {
                        checkbox += "\n" + hold.getMenu();
                        checkbox_id +=  hold.getId()+",";


                    }
                }
                if (!checkbox.isEmpty()) {
                    dipilih = checkbox;
                    String preguntas = checkbox_id;
                    mPref = getActivity().getSharedPreferences(MIEXAMEN, Context.MODE_PRIVATE);


                    SharedPreferences.Editor editor = mPref.edit();




                    editor.putString("preguntas_numero_string",preguntas);
                    editor.putString("preguntas_string",dipilih);

                    Log.d("seleccion","seleccion preguntas "+preguntas);
                    Log.d("seleccion","seleccion dipilih "+dipilih);

                    editor.apply();




                } else {
                    dipilih = "No has seleccionado ningún tema.";
                }

                formSubmit(dipilih);
            }
        });

3 个答案:

答案 0 :(得分:1)

进行以下更改:

将数据添加到数据列表中时。

                    Data item = new Data();

                    item.setMenu(obj.getString(TAG_NOMBRE));
                    item.setId(obj.getString(TAG_ID));
                    item.setCheckbox(true)

                    itemList.add(item);

这将首先使复选框处于选中状态。

修改:

更新您的xml布局。在您的CheckBox中放置此属性。

android:clickable="false"

更新您的列表setOnItemClickListener

    list.setOnItemClickListener(new OnItemClickListener() {
          @Override
          public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            adapter.setCheckBox(position);
          }
    });

答案 1 :(得分:0)

尝试用以下代码替换

viewHolder.checkBox.setChecked(true);

代替

if(items.isCheckbox()){
            viewHolder.checkBox.setChecked(true);
        } else {
            viewHolder.checkBox.setChecked(false);
        }

答案 2 :(得分:0)

使用它。它应该工作。 -

最初是这个-

viewHolder.checkBox.setChecked(true);

然后

  viewHolder.checkBox.setOnCheckedChangeListener(new 
  CompoundButton.OnCheckedChangeListener() {

    @Override
   public void onCheckedChanged(CompoundButton 
     buttonView,boolean isChecked) {
   if(isChecked){
           viewHolder.checkBox.setChecked(true);
       } else {
           viewHolder.checkBox.setChecked(false);
       }
   }

} );