【问题标题】:How to check a checkbox if it is checked prevoiusly如果先前已选中,如何选中复选框
【发布时间】:2015-07-14 09:00:15
【问题描述】:

我已经在列表中实现了复选框,有一个带有复选框的名称。我的问题是,我将选择五个名称并显示这些名称,然后如果我返回列表,则应再次检查这五个名称,因为我已经选择了这些名称。

但现在当我重新访问时,这些都未选中。如何做到这一点。

我的适配器代码。

     holder.UserId_Fk.setText(tempValues.getUserId_Fk().toString());
            holder.chkbox.setOnCheckedChangeListener(null);

            holder.chkbox.setChecked(checkedHolder[position]);
            Log.i(TAG, "Position " + checkedHolder[position]);

            if (checkedHolder[position])
                holder.chkbox.setChecked(true);
            else
                holder.chkbox.setChecked(false);

            holder.chkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                        @Override
                        public void onCheckedChanged(CompoundButton buttonView,
                                boolean isChecked) {

                            checkedHolder[position] = isChecked;
                            Log.i(TAG, "Position " + checkedHolder[position]);
                        }
                    });

我的活动代码..

list.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {

                CheckBox cb = (CheckBox) view.findViewById(R.id.chkbox);

                cb.performClick();

                if (cb.isChecked()) {

                    for (int i = 0; i < adapter.getCount(); i++) {
                        if (adapter.checkedHolder[i]) {
                            // get all name values that checked by user
                            MemberName.clear();
                            MemberName.add(ItemsArr.get(i).getItemName().toString());
                            cb.setChecked(true);
                            Log.i(TAG, "Name " + MemberName);
                            // Name = ItemsArr.get(i).getItemName().toString();
                            //Log.i(TAG, "Name " + Name);
                        }
                    }
                } else if (!cb.isChecked()) {

                }    
            }    
        });

【问题讨论】:

  • 您可以使用地图 Map 并在调用该方法时转到“重新选择”选中的复选框,因此如果整数位置的布尔值为真,则将复选框设置为真。
  • 你必须保存他们的位置。
  • 你不应该问你的代码是否可以为你编辑,因为我们知道这可能是一个家庭作业问题。您应该要求提供说明概念的示例或指向有用页面的链接。如果有人只是简单地编辑了您的代码并且您只是接受它为工作,您将不会了解它,但不知道它为什么工作。在这种情况下,我建议寻找有关范围和持久性的主题。

标签: java android checkbox


【解决方案1】:

除非您将状态存储在某处,否则每次返回列表时,它都会被视为一个新实例。结果,所有框都将恢复为未选中状态。

当您离开列表时,将选中的值保存到某种持久性存储中,例如设备存储,或者将框的状态传递到您要去的屏幕,以便可以将其传递回导航返回时列出。或者将它们保存到具有全局范围且在移动屏幕时不会超出范围的变量中。

当您返回列表时,查看是否有要使用的状态(在设备存储中、作为参数传入或您使用的任何持久性方式)然后使用它重新选中相应的框.

【讨论】:

  • 如何保存可以指导我
  • 我已经提到了三种方法。最简单的可能是全局范围。当您要离开时,获取每个复选框的选中状态并将其存储在 List、Map 或其他集合变量中。不知道你的程序的确切结构我不能说把这个集合放在哪里,但它必须是列表可以访问的地方,并且在你返回时不会结束或不再使用列表。
  • 是的,@ForceGaia 是对的,您需要保存复选框的状态,以便恢复状态。你可以检查这个链接朋友:) custom checkbox difficulty in android
【解决方案2】:

试试这个。我已经编辑了你的代码

 private static Map<Integer, Boolean> mapCheck = new HashMap<Integer, Boolean>();
     holder.UserId_Fk.setText(tempValues.getUserId_Fk().toString());
        holder.chkbox.setOnCheckedChangeListener(null);

        holder.chkbox.setChecked(checkedHolder[position]);
        Log.i(TAG, "Position " + checkedHolder[position]);

        if (checkedHolder[position])
            holder.chkbox.setChecked(true);
        else
            holder.chkbox.setChecked(false);

        holder.chkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView,
                            boolean isChecked) {
            mapCheck.put(position, true);
                        checkedHolder[position] = isChecked;
                        Log.i(TAG, "Position " + checkedHolder[position]);
                    }
                });

还有这个:

list.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {

            CheckBox cb = (CheckBox) view.findViewById(R.id.chkbox);

            cb.performClick();

            if (cb.isChecked()) {
        /*
                for (int i = 0; i < adapter.getCount(); i++) {
                    if (adapter.checkedHolder[i]) {
                        // get all name values that checked by user
                        MemberName.clear();
                        MemberName.add(ItemsArr.get(i).getItemName().toString());
                        cb.setChecked(true);
                        Log.i(TAG, "Name " + MemberName);
                        // Name = ItemsArr.get(i).getItemName().toString();
                        //Log.i(TAG, "Name " + Name);
                    } */

          //SEARCH POSITION WHERE ARE TRUE
           for(Integer i : mapCheck.keySet())
            {
          if(mapCheck.get(i) == true)
           {
             cb.setChecked(true);
           }
          }
                }
            } else if (!cb.isChecked()) {

            }

        }

    });

【讨论】:

  • @Simon 有错误吗?
猜你喜欢
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
相关资源
最近更新 更多