Android Multiple Selection Spinner

xiaoxiao2021-02-28  137

Android multiple selection spinner widget

package com.guna.libmultispinner; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnMultiChoiceClickListener; import android.util.AttributeSet; import android.widget.ArrayAdapter; import android.widget.Spinner; import android.widget.SpinnerAdapter; import java.util.Arrays; import java.util.LinkedList; import java.util.List; public class MultiSelectionSpinner extends Spinner implements OnMultiChoiceClickListener { public interface OnMultipleItemsSelectedListener{ void selectedIndices(List<Integer> indices); void selectedStrings(List<String> strings); } private OnMultipleItemsSelectedListener listener; String[] _items = null; boolean[] mSelection = null; boolean[] mSelectionAtStart = null; String _itemsAtStart = null; ArrayAdapter<String> simple_adapter; public MultiSelectionSpinner(Context context) { super(context); simple_adapter = new ArrayAdapter<>(context, android.R.layout.simple_spinner_item); super.setAdapter(simple_adapter); } public MultiSelectionSpinner(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) { mSelection[which] = isChecked; simple_adapter.clear(); simple_adapter.add(buildSelectedItemString()); } else { throw new IllegalArgumentException( "Argument 'which' is out of bounds."); } } @Override public boolean performClick() { 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); 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); } }); builder.show(); return true; } @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 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(); } }

使用方法

MultiSelectionSpinner spinner = new MultiSelectionSpinner(context);String[] strArray = new String[]{"水泥杆","变压器","隔离开关"};List<String> strList = Arrays.asList(strArray);ArrayAdapter<String> adapter = new ArrayAdapter<String>(context, android.R.layout.simple_spinner_item, strList);adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);spinner.setItems(strList);

转载请注明原文地址: https://www.6miu.com/read-36655.html

最新回复(0)