Why is ListView.getCheckedItemPositions() not returning correct values?

前端 未结 15 1871
北海茫月
北海茫月 2020-11-29 06:01

The app has a ListView with multiple-selection enabled, in the UI it works as expected. But when I read the values out using this code:

Log.         


        
相关标签:
15条回答
  • 2020-11-29 06:36
    ArrayList<String> selectedChildren = new ArrayList<String>();
    
    for(int i = 0;i<list.getChildCount();i++)
    {
        CheckBox c = (CheckBox) list.getChildAt(i);
        if(c.isChecked())
        {
            String child = c.getText().toString();
            selectedChildren.add(child);
        }
    }
    Log.i(TAG, "onClick: " + selectedChildren.size());
    
    0 讨论(0)
  • 2020-11-29 06:39

    This is an old thread but since this basically came up first in current Google search here's a quick way to understand what listView.getCheckedItemPositions() does:

    Unless the list Item wasn't 'toggled' at all in your ListView, it wont be added to the SparseBooleanArray that is returned by listView.getCheckedItemPositions()

    But then, you really don't want your users to click every list item to "properly" add it to the returned SparseBooleanArray right?

    Hence you need to combine the usage of valueAt() AND keyAt() of the SparseBooleanArray for this.

        SparseBooleanArray checkedArray = listView.getCheckedItemPositions();
    
        ArrayList<DataEntry> entries = baseAdapter.getBackingArray(); //point this to the array of your custom adapter
    
        if (checkedArray != null)
        {
            for(int i = 0; i < checkedArray.size(); i++)
            {
                if(checkedArray.valueAt(i))    //valueAt() gets the boolean
                    entries.yourMethodAtIndex(checkedArray.keyAt(i)); //keyAt() gets the key
            }
        }
    
    0 讨论(0)
  • 2020-11-29 06:42

    I still do not know why, but in my scenario, getCheckedItemPositions() returns false values for all items. I cannot see a way to use the methods on the ListView to get the boolean values out. The SparseBooleanArray object seems to have no real-world data in it. I suspect this may be because of some quirk of my implementation, perhaps that I've subclassed ArrayAdapter. It's frustrating, issues like this are a real time-drain.

    Anyway, the solution I have used is to to attach a handler to each Checkbox individually as ListView rows are created. So from ListView.getView() I call this method:

    private void addClickHandlerToCheckBox(CheckBox checkbox) {
      checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
          public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
            CheckBox checkbox = (CheckBox)arg0; 
            boolean isChecked = checkbox.isChecked();
            // Store the boolean value somewhere durable
          }
      });
    }
    
    0 讨论(0)
提交回复
热议问题