Multi Selection Spinner in Android Without Alertdialog

Android Spinner With Multiple Selection

ohhh, The small and miner mistake you've done is you forgot to implement the interface MultiSpinnerListener. Your DCOReader Activity should be like this,

public class DCOReader extends AppCompatActivity implements MultiSpinner.MultiSpinnerListener{
....
}

how to disable the item selection once the Limit exceeds in MultiSelection Spinner Android

Try this. I have modified your public void setDeselection(int index) and public boolean performClick() methods.

public class MultiSelectSpinner1 extends Spinner implements
DialogInterface.OnMultiChoiceClickListener {

private static final String TAG = MultiSelectSpinner1.class.getSimpleName();
String[] _items = null;
boolean[] mSelection = null;
boolean[] mSelectionAtStart = null;
String _itemsAtStart = null;

ArrayAdapter<String> simple_adapter;
private OnMultipleItemsSelectedListener listener;

AlertDialog alertDialog;

public MultiSelectSpinner1(Context context) {
super(context);
simple_adapter = new ArrayAdapter<>(context,
android.R.layout.simple_spinner_item);
super.setAdapter(simple_adapter);
}

public MultiSelectSpinner1(Context context, AttributeSet attrs) {
super(context, attrs);

simple_adapter = new ArrayAdapter<>(context,
android.R.layout.simple_spinner_item);
super.setAdapter(simple_adapter);
}

public void setListener(OnMultipleItemsSelectedListener listener)
{
this.listener = listener;
}

public void onClick(DialogInterface dialog, int which, boolean isChecked) {
if (mSelection != null && which < mSelection.length) {
Log.e("_items.length", "_items.length" + _items.length);
Log.e("_itemsAtStart", "_itemsAtStart" + _itemsAtStart);

if (getSelectedIndices().size() < 3) {
mSelection[which] = isChecked;
simple_adapter.clear();
simple_adapter.add(buildSelectedItemString());
} else {
Toast.makeText(getContext(),"Exceeds",Toast.LENGTH_SHORT).show();
setDeselection(which);

}
} else {
throw new IllegalArgumentException(
"Argument 'which' is out of bounds.");
}
}

@Override
public boolean performClick() {
buildDialogue();
return true;
}

private void buildDialogue() {
if(alertDialog!=null&&alertDialog.isShowing())
alertDialog.dismiss();

AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setTitle("Please select!!!");
builder.setMultiChoiceItems(_items, mSelection, this);
_itemsAtStart = getSelectedItemsAsString();
builder.setPositiveButton("Submit", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
System.arraycopy(mSelection, 0, mSelectionAtStart, 0, mSelection.length);
if (listener != null) {
listener.selectedIndices(getSelectedIndices());
listener.selectedStrings(getSelectedStrings());
}
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
simple_adapter.clear();
simple_adapter.add(_itemsAtStart);
System.arraycopy(mSelectionAtStart, 0, mSelection, 0, mSelectionAtStart.length);
}
});
alertDialog = builder.create();
alertDialog.show();
}

@Override
public void setAdapter(SpinnerAdapter adapter) {
throw new RuntimeException(
"setAdapter is not supported by MultiSelectSpinner.");
}

public void setItems(String[] items) {
_items = items;
mSelection = new boolean[_items.length];
mSelectionAtStart = new boolean[_items.length];
simple_adapter.clear();
simple_adapter.add(_items[0]);
Arrays.fill(mSelection, false);
mSelection[0] = true;
mSelectionAtStart[0] = true;
}

public void setItems(List<String> items) {
_items = items.toArray(new String[items.size()]);
mSelection = new boolean[_items.length];
mSelectionAtStart = new boolean[_items.length];
simple_adapter.clear();
simple_adapter.add(_items[0]);
Arrays.fill(mSelection, false);
mSelection[0] = true;
}

public void setSelection(String[] selection) {
for (int i = 0; i < mSelection.length; i++) {
mSelection[i] = false;
mSelectionAtStart[i] = false;
}
for (String cell : selection) {
for (int j = 0; j < _items.length; ++j) {
if (_items[j].equals(cell)) {
mSelection[j] = true;
mSelectionAtStart[j] = true;
}
}
}
simple_adapter.clear();
simple_adapter.add(buildSelectedItemString());
}

public void setSelection(List<String> selection) {
for (int i = 0; i < mSelection.length; i++) {
mSelection[i] = false;
mSelectionAtStart[i] = false;
}
for (String sel : selection) {
for (int j = 0; j < _items.length; ++j) {
if (_items[j].equals(sel)) {
mSelection[j] = true;
mSelectionAtStart[j] = true;
}
}
}
simple_adapter.clear();
simple_adapter.add(buildSelectedItemString());
}

public void setSelection(int index) {
for (int i = 0; i < mSelection.length; i++) {
mSelection[i] = false;
mSelectionAtStart[i] = false;
}
if (index >= 0 && index < mSelection.length) {
mSelection[index] = true;
mSelectionAtStart[index] = true;
} else {
throw new IllegalArgumentException("Index " + index
+ " is out of bounds.");
}
simple_adapter.clear();
simple_adapter.add(buildSelectedItemString());
}

public void setDeselection(int index) {
Log.d(TAG, "setDeselection() called with: " + "index = [" + index + "]");

if (index >= 0 && index < mSelection.length) {
mSelection[index] = false;
mSelectionAtStart[index] = false;

} else {
throw new IllegalArgumentException("Index " + index
+ " is out of bounds.");
}
simple_adapter.clear();
simple_adapter.notifyDataSetChanged();
simple_adapter.add(buildSelectedItemString());

buildDialogue();
}

public void setSelection(int[] selectedIndices) {
for (int i = 0; i < mSelection.length; i++) {
mSelection[i] = false;
mSelectionAtStart[i] = false;
}
for (int index : selectedIndices) {
if (index >= 0 && index < mSelection.length) {
mSelection[index] = true;
mSelectionAtStart[index] = true;
} else {
throw new IllegalArgumentException("Index " + index
+ " is out of bounds.");
}
}
simple_adapter.clear();
simple_adapter.add(buildSelectedItemString());
}

public List<String> getSelectedStrings() {
List<String> selection = new LinkedList<>();
for (int i = 0; i < _items.length; ++i) {
if (mSelection[i]) {
selection.add(_items[i]);
}
}
return selection;
}

public List<Integer> getSelectedIndices() {
List<Integer> selection = new LinkedList<>();
for (int i = 0; i < _items.length; ++i) {
if (mSelection[i]) {
selection.add(i);
}
}
return selection;
}

private String buildSelectedItemString() {
StringBuilder sb = new StringBuilder();
boolean foundOne = false;

for (int i = 0; i < _items.length; ++i) {
if (mSelection[i]) {
if (foundOne) {
sb.append(", ");
}
foundOne = true;

sb.append(_items[i]);
}
}
return sb.toString();
}

public String getSelectedItemsAsString() {
StringBuilder sb = new StringBuilder();
boolean foundOne = false;

for (int i = 0; i < _items.length; ++i) {
if (mSelection[i]) {
if (foundOne) {
sb.append(", ");
}
foundOne = true;
sb.append(_items[i]);
}
}
return sb.toString();
}

public interface OnMultipleItemsSelectedListener {
void selectedIndices(List<Integer> indices);

void selectedStrings(List<String> strings);
}
}

Multi selection in spinner

By default Spinner control is in Single Choice selection mode.

What you done is you just changed the Layout to show the spinner item with Checkbox. which doesn't mean you are showing an muti selection spinner control.

You can refer any below mentioned sample to implement multi select spinner.

multi-select-drop-down-list

android-spinner-like-ui-for-selecting-multiple-options

spinner-with-multiple-selectiondescription here

Multiple Selection Spinner

S spinner is designed to show one item at a time. You might get away by making a spinner of checkboxes, but it will be probably an awful user experience.

I would suggest you a ListView instead and CHOICE_MODE_MULTIPLE. You can add a listview to a dialog as shown in this answer: is it possible to create listview inside dialog?



Related Topics



Leave a reply



Submit