How to get selected chips from ChipGroup?

14,814

Solution 1

Starting with the version 1.2.0 you can use the method chipGroup.getCheckedChipIds()

List<Integer> ids = chipGroup.getCheckedChipIds();
for (Integer id:ids){
      Chip chip = chipGroup.findViewById(id);
      //....
}

OLD ANSWER with 1.1.0:

currently there isn't a direct API to get the selected chips.
However you can iterate through the children of the ChipGroup and check chip.isChecked().

   ChipGroup chipGroup = findViewById(R.id.....);
   for (int i=0; i<chipGroup.getChildCount();i++){
      Chip chip = (Chip)chipGroup.getChildAt(i);
      if (chip.isChecked()){
         //this chip is selected..... 
      }
    }

Solution 2

the solution I used in Kotlin with data binding

mBinding?.chipGroup?.children
            ?.toList()
            ?.filter { (it as Chip).isChecked }
            ?.forEach { //here are your selected chips as 'it' }

And here is how I got just titles

mBinding?.chipGroup?.children
            ?.toList()
            ?.filter { (it as Chip).isChecked }
            ?.joinToString(", ") { (it as Chip).text }

Solution 3

Get selected chip's text in a chip group

To get selected chip's text from chipgroup, you can use this one liner in Kotlin:

val selectedChipText = parentChipGroup.findViewById<Chip>(parentChipGroup.checkedChipId).text.toString()

Solution 4

I used below mentioned method to detect the selected chips in chipGroup.

for (chipTitle in stringList) {
    val chip = Chip(chipGroup.context)
    chip.text = chipTitle
    chip.tag = chipTitle
    chip.isClickable = true
    chip.isCheckable = true
    chip.setOnCheckedChangeListener { _, isChecked ->
        if (isChecked){
            Log.e(TAG, chipTitle)
        }
    }
    chipGroup.addView(chip)
}
chipGroup.isSingleSelection = true
Share:
14,814
msayubi76
Author by

msayubi76

Updated on June 14, 2022

Comments

  • msayubi76
    msayubi76 almost 2 years

    I search a lot on internet but couldn't find the exact solution. Here is the link that i last tried from SO. Get selected Chips from a ChipGroup

    I want to get selected chips from chip group when a button is clicked.

    This function contain information of displaying names in RecyclerView

    private void getNames() {
        List<String> names = Arrays.asList(getResources().getStringArray(R.array.names));
        int count = 0;
        for ( String name : names){
            list.add(new Names(name));
            count++;
        }
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setHasFixedSize(true);
        namesAdapter = new NamesAdapter(MainActivity.this, list);
        recyclerView.setAdapter(namesAdapter);
    }
    

    When click on RecyclerView item one chip is added into the ChipGroup here is the function

    public void onItemSelected(Names name) {
        Chip chip = new Chip(this);
        chip.setText(name.getName());
        chip.setCloseIconVisible(true);
        chip.setCheckable(false);
        chip.setClickable(false);
        chip.setOnCloseIconClickListener(this);
        chipGroup.addView(chip);
        chipGroup.setVisibility(View.VISIBLE);
    }
    

    This is the image of displaying chips in ChipGroup

    Function that is getting values from ChipGroup

    public void getChipGroupValues(){
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ChipGroup chipGroup = findViewById(R.id.chipGroup);
                for (int i=0; i<chipGroup.getChildCount();i++){
                    Chip chip = (Chip)chipGroup.getChildAt(i);
                    Log.i("outside if ", i+ " chip = " + chip.getText().toString());
                    if (chip.isChecked()){
                        Log.i("inside if ", i+ " chip = " + chip.getText().toString());
                        textView.setText(chip.getText().toString());
                    }
                }
            }
        });
    }
    

    This is output enter image description here

    build.gradle(Module.app) detail enter image description here

  • msayubi76
    msayubi76 over 4 years
    A little close this is working fine but outsite the the "if" statement i'm getting all values not insite the "if" condition. what is the purpose of this statement?
  • Gabriele Mariotti
    Gabriele Mariotti over 4 years
    @msayubi76 You question is I want to get selected chips from chip group when a button is clicked. In your OnClickListener you have to iterate through the ChipGroup and get only the selected values. The if statement is the only way to know if each chip is checked
  • msayubi76
    msayubi76 over 4 years
    but in this case control is not going inside the if statement.i'm getting values outside the if statement
  • Gabriele Mariotti
    Gabriele Mariotti over 4 years
    @msayubi76 which version are you using of material components library? I've just tried the code and it works.
  • msayubi76
    msayubi76 over 4 years
    i added this in dependencies "com.google.android.material:material:1.0.0"
  • Gabriele Mariotti
    Gabriele Mariotti over 4 years
    it is the latest stable and at the same time it was release quite 1 year ago. try the 1.1.0-alpha10 (it will become beta soon)
  • msayubi76
    msayubi76 over 4 years
    i added 1.1.0-alpha 10 but results the same as before. also i updated the question for more detail
  • Gabriele Mariotti
    Gabriele Mariotti over 4 years
    @msayubi76 it seems that your chips are not selectable (and then no one is checked). Use chip.setCheckable(true); in your code and remove chip.setClickable(false);
  • msayubi76
    msayubi76 over 4 years
  • Pooja
    Pooja over 3 years
    Helpful... Thanks
  • Roar Grønmo
    Roar Grønmo about 3 years
    Or if you have populated the tag variable you could use that, like: siteTypeId = registerCardChipGroupSiteTypes .findViewById<Chip>(registerCardChipGroupSiteTypes.checkedCh‌​ipId).tag.toString()‌​.toLong()
  • Bitwise DEVS
    Bitwise DEVS about 3 years
    Will this work even when you added chip to the group during runtime? What will be their id?
  • Bitwise DEVS
    Bitwise DEVS about 3 years
    I think adding tag can be a good alternative for runtime GroupChip inflation