Skip to content

Instantly share code, notes, and snippets.

@lzcapp
Created September 29, 2024 07:36
Show Gist options
  • Select an option

  • Save lzcapp/a4585da2151562170a638f1f206f717a to your computer and use it in GitHub Desktop.

Select an option

Save lzcapp/a4585da2151562170a638f1f206f717a to your computer and use it in GitHub Desktop.
package com.xxx.xxx;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.util.AttributeSet;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import java.util.Arrays;
import java.util.List;
public class MultiSpinner extends Spinner implements DialogInterface.OnMultiChoiceClickListener, DialogInterface.OnCancelListener {
private List<String> items;
private boolean[] selected;
private String defaultText;
private MultiSpinnerListener listener;
public MultiSpinner(Context context) {
super(context);
}
public MultiSpinner(Context arg0, AttributeSet arg1) {
super(arg0, arg1);
}
public MultiSpinner(Context arg0, AttributeSet arg1, int arg2) {
super(arg0, arg1, arg2);
}
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
selected[which] = isChecked;
}
@Override
public void onCancel(DialogInterface dialog) {
// refresh text on spinner
StringBuilder spinnerBuffer = new StringBuilder();
boolean someSelected = false;
for (int i = 0; i < items.size(); i++) {
if (selected[i]) {
spinnerBuffer.append(items.get(i));
spinnerBuffer.append(", ");
someSelected = true;
}
}
String spinnerText;
if (someSelected) {
spinnerText = spinnerBuffer.toString();
if (spinnerText.length() > 2) {spinnerText = spinnerText.substring(0, spinnerText.length() - 2);}
} else {
spinnerText = defaultText;
}
ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_item, new String[]{spinnerText});
setAdapter(adapter);
listener.onItemsSelected(selected);
}
@Override
public boolean performClick() {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setMultiChoiceItems(items.toArray(new CharSequence[0]), selected, this);
builder.setPositiveButton(android.R.string.ok, (dialog, which) -> dialog.cancel());
builder.setOnCancelListener(this);
builder.show();
return true;
}
public void setItems(List<String> items, String allText, MultiSpinnerListener listener) {
this.items = items;
this.defaultText = allText;
this.listener = listener;
// all [not] selected by default
selected = new boolean[items.size()];
Arrays.fill(selected, false);
// all text on the spinner
ArrayAdapter<String> adapter = new ArrayAdapter<>(getContext(), android.R.layout.simple_spinner_item, new String[]{allText});
setAdapter(adapter);
}
public interface MultiSpinnerListener {
public void onItemsSelected(boolean[] selected);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment