Android Multiple Selection Spinner

来源:互联网 发布:金曲软件 编辑:程序博客网 时间:2024/06/05 05:13

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();    }}


原创粉丝点击