【问题标题】:Listview items with checkbox checked at start在开始时选中复选框的 Listview 项目
【发布时间】:2019-06-27 09:39:15
【问题描述】:

我有一个带有 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;
    }
}

一开始我需要检查所有复选框。

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

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

我应该如何将所有项目置于检查状态,以便在单击按钮时所有项目都被识别为已检查?

这是开始时未选中所有项目的屏幕截图:

编辑

片段中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);
            }
        });

【问题讨论】:

  • 在创建复选框之后 viewHolder.checkBox.setChecked(true) 怎么样。
  • 您是否尝试将 setCheck = 'true' 设置为行 xml 中的复选框?
  • @AnupamBose,我已经尝试过您的建议,这些项目似乎已被选中,但在单击按钮时未被识别为已选中
  • @Umair,已经完成了
  • 好吧.. 让我看看。我想我以前做过。

标签: android listview checkbox


【解决方案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);
          }
    });

【讨论】:

  • 你能解释一下这种行为吗?使用上述代码后发生了什么?
  • 所有项目都显示为已选中,没关系,但是单击按钮时,没有选中任何复选框
  • 你能告诉我你在用setCheckBox方法做什么吗?因为我在任何地方都看不到它的用法。
  • 从片段中调用:list.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView> adapterView, View view, int position, long l) { adapter. setCheckBox(位置); } }); adapter = new Adapter(getActivity(), (ArrayList) itemList); list.setAdapter(适配器);
  • 你不需要。这就是原因。它不工作。如果您想在单击该行时更改检查。让我为你更新答案。
【解决方案2】:

尝试用下面的代码替换

viewHolder.checkBox.setChecked(true);

而不是

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

【讨论】:

  • 谢谢,但结果相同。所有项目似乎都已选中,但未被识别为已选中。
  • @not 识别的意思是你说它是否被检查?
  • 我已经包含了按钮代码,可能是问题所在。该按钮应检查所有复选框的检查状态
【解决方案3】:

使用这个。它应该工作。 -

最初是这个 -

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);
       }
   }

} );

【讨论】:

  • 对不起那个兄弟!
猜你喜欢
  • 2014-02-20
  • 2015-11-29
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 2012-08-09
相关资源
最近更新 更多