1

I can populate more than 1 spinner in Android with multiple values. I want to display more than 1 value in spinner i.e In "0" position (spinner index) I want to set more than one value as per the user dynamically. When user select the first value that will set in 0 position and when user click the second value it will added to same 0 position without replacing it. So that two values can be visible and can be use.

Is it possible in android spinner? If yes any suggestion please ..

akuzma
  • 1,592
  • 6
  • 22
  • 49
android learner
  • 1,804
  • 3
  • 15
  • 13
  • Yes, possible. the term you are looking is `spinner with multiple selection`. refer http://stackoverflow.com/questions/5015686/android-spinner-with-multiple-choice and a tutorial from http://v4all123.blogspot.in/2013/09/spinner-with-multiple-selection-in.html – Linga Jan 15 '14 at 08:37
  • thank you i will check and let you know :) – android learner Jan 15 '14 at 08:40
  • still you are struggling? – Linga Jan 15 '14 at 11:13
  • @ling.s thank you a lot for your concern .Now i can select multi string in android but till now i am struggling how can i use arraylist in Multispinner Class so that i can select multiple name with their id for a particular spinner . – android learner Jan 30 '14 at 12:13

2 Answers2

2

You can follow the

http://labs.makemachine.net/2010/03/android-multi-selection-dialogs/ or http://v4all123.blogspot.in/2013/09/spinner-with-multiple-selection-in.html. Let me know if any error?? check this, I think this is what you looking for http://codethis.wordpress.com/2012/06/17/a-spinner-control-for-android-with-multi-select-support/

In MultiSelectionSpinner Class

import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

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;

public class MultiSelectionSpinner extends Spinner implements  OnMultiChoiceClickListener {  
    String[] _items = null;  

    boolean[] mSelection = null;  

    ArrayAdapter<String> simple_adapter;  

    public MultiSelectionSpinner(Context context) {  
        super(context);  

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

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

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

    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.setMultiChoiceItems(_items, mSelection, this);  
        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];  
        simple_adapter.clear();  
        simple_adapter.add(_items[0]);  
        Arrays.fill(mSelection, false);  
    }  

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

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

    public void setSelection(List<String> selection) {  
        for (int i = 0; i < mSelection.length; i++) {  
            mSelection[i] = false;  
        }  
        for (String sel : selection) {  
            for (int j = 0; j < _items.length; ++j) {  
                if (_items[j].equals(sel)) {  
                    mSelection[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;  
        }  
        if (index >= 0 && index < mSelection.length) {  
            mSelection[index] = true;  
        } else {  
            throw new IllegalArgumentException("Index " + index  
                    + " is out of bounds.");  
        }  
        simple_adapter.clear();  
        simple_adapter.add(buildSelectedItemString());  
    }  

    public void setSelection(int[] selectedIndicies) {  
        for (int i = 0; i < mSelection.length; i++) {  
            mSelection[i] = false;  
        }  
        for (int index : selectedIndicies) {  
            if (index >= 0 && index < mSelection.length) {  
                mSelection[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<String>();  
        for (int i = 0; i < _items.length; ++i) {  
            if (mSelection[i]) {  
                selection.add(_items[i]);  
            }  
        }  
        return selection;  
    }  

    public List<Integer> getSelectedIndicies() {  
        List<Integer> selection = new LinkedList<Integer>();  
        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();  
    }  
} 
Pratik Butani
  • 60,504
  • 58
  • 273
  • 437
Subhalaxmi
  • 5,687
  • 3
  • 26
  • 42
1

Blow is the solution :-

   package com.kazi.createActivity;


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 com.kazi.R;

import java.util.List;


public class MultiSpinner  extends Spinner implements
        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) {
        if (isChecked)
            selected[which] = true;
        else
            selected[which] = false;
    }

    @Override
    public void onCancel(DialogInterface dialog) {
        // refresh text on spinner
        StringBuffer spinnerBuffer = new StringBuffer();
        boolean someUnselected = false;
        for (int i = 0; i < items.size(); i++) {
            if (selected[i] == true) {
                spinnerBuffer.append(items.get(i));
                spinnerBuffer.append(", ");
            } else {
                someUnselected = true;
            }
        }
        String spinnerText;
        if (someUnselected) {
            spinnerText = spinnerBuffer.toString();
            if (spinnerText.length() > 2)
                spinnerText = spinnerText.substring(0, spinnerText.length() - 2);
        } else {
            spinnerText = defaultText;
        }
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(),
              R.layout.spinner_list_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[items.size()]), selected, this);
        builder.setPositiveButton(android.R.string.ok,
                new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.cancel();
                    }
                });
        builder.setOnCancelListener(this);
        builder.show();
        return true;
    }

    public void setItems(List<String> items, String[] allText,
                         MultiSpinnerListener listener) {
        this.items = items;

        this.listener = listener;

        // all selected by default
        selected = new boolean[items.size()];
        for (int i = 0; i < selected.length; i++)
            selected[i] = false;

        // all text on the spinner
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(),
                R.layout.spinner_list_item, allText );
        setAdapter(adapter);
    }

    public interface MultiSpinnerListener {
        public void onItemsSelected(boolean[] selected);
    }
}

I created this xml layout:-

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/spiner_item"
android:layout_width="match_parent"
android:layout_height="@dimen/spiner_height"
android:background="@drawable/rounded_edittext"
android:gravity="center_vertical"
android:paddingLeft="5dp"
android:text="Medium Text"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="@android:color/black" />
Akanksha Rathore
  • 3,603
  • 3
  • 31
  • 47