How to get selected chips from ChipGroup?
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
msayubi76
Updated on June 14, 2022Comments
-
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()); } } } }); }
-
msayubi76 over 4 yearsA 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 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 theChipGroup
and get only the selected values. Theif
statement is the only way to know if eachchip
ischecked
-
msayubi76 over 4 yearsbut in this case control is not going inside the if statement.i'm getting values outside the if statement
-
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 over 4 yearsi added this in dependencies "com.google.android.material:material:1.0.0"
-
Gabriele Mariotti over 4 yearsit 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 over 4 yearsi added 1.1.0-alpha 10 but results the same as before. also i updated the question for more detail
-
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 removechip.setClickable(false);
-
msayubi76 over 4 yearsLet us continue this discussion in chat.
-
Pooja over 3 yearsHelpful... Thanks
-
Roar Grønmo about 3 yearsOr if you have populated the tag variable you could use that, like:
siteTypeId = registerCardChipGroupSiteTypes .findViewById<Chip>(registerCardChipGroupSiteTypes.checkedChipId).tag.toString().toLong()
-
Bitwise DEVS about 3 yearsWill this work even when you added chip to the group during runtime? What will be their id?
-
Bitwise DEVS about 3 yearsI think adding tag can be a good alternative for runtime GroupChip inflation