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
How to Dismiss a Progress Bar Even If There Is No View to Populate in the Firebaselistadapter
Current Month Facebook Friends Birthdays in Android
How to Have Searched Characters Colored When We Use Searchview in Recyclerview
Gradle Dsl Method Not Found: 'Runproguard'
Android:Locationmanager VS Google Play Services
Add Shadow to Custom Shape on Android
Debugging SQLite Database on the Device
Android Get Current Locale, Not Default
Android Facebook 4.0 Sdk How to Get Email, Date of Birth and Gender of User
Android Action Bar Not Showing Overflow
Android - How to Get the Processname or Packagename by Using Pid
How to Get Cell Service Signal Strength in Android
Pass Arraylist from One Activity to Other
Service Not Available - Geocoder Android