menontheChessboard
menontheChessboard

Reputation: 71

Multi Select Spinner Xamarin Android

I am using a spinner and an arrayAdapter to populate items in spinner. I want to make the spinner multi-selectable but I just select one row.I searched in Google, solution available in Java, but i don't have any idea on how to implement it in Xamarin.

My code is as below,

adapterList= new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItemMultipleChoice);

spnMultiTest.Adapter = adapterList;

Upvotes: 1

Views: 1338

Answers (1)

Elvis Xia - MSFT
Elvis Xia - MSFT

Reputation: 10841

I want to make the spinner multi-selectable but I just select one row.I searched in Google, solution available in Java, but i don't have any idea on how to implement it in Xamarin.

Basically I just translate the codes from Android Spinner with multiple choice to Xamarin codes. I have tested it and it works fine:

  1. MultiSpinner.cs:

    public interface MultiSpinnerListener
    {
        void onItemsSelected(bool[] selected);
    }
    public class MultiSpinner : Spinner, IDialogInterfaceOnMultiChoiceClickListener, IDialogInterfaceOnCancelListener
    {
        Context _context;
    
        private List<String> items;
        private bool[] selected;
        private String defaultText;
        private MultiSpinnerListener listener;
    
        public MultiSpinner(Context context) : base(context)
        {
            _context = context;
        }
    
        public MultiSpinner(Context context, IAttributeSet arg1) : base(context, arg1)
        {
            _context = context;
       }
    
        public MultiSpinner(Context context, IAttributeSet arg1, int arg2) : base(context, arg1, arg2)
        {
            _context = context;
        }
    
    
        public  void OnClick(IDialogInterface dialog, int which, bool isChecked)
        {
            if (isChecked)
                selected[which] = true;
            else
                selected[which] = false;
        }
    
        public override void OnClick(IDialogInterface dialog, int which)
        {
            dialog.Cancel();
        }
    
    
        public override bool PerformClick()
        {
            AlertDialog.Builder builder = new AlertDialog.Builder(_context);
            builder.SetMultiChoiceItems(
                    items.ToArray(), selected, this);
    
            builder.SetPositiveButton("OK",this);
            builder.SetOnCancelListener(this);
            builder.Show();
            return true;
        }
    
    
        public void SetItems(List<String> items, String allText,
            MultiSpinnerListener listener)
        {
    
            this.items = items;
            this.defaultText = allText;
            this.listener = listener;
    
            // all selected by default
            selected = new bool[items.Count];
            for (int i = 0; i < selected.Length; i++)
                selected[i] = true;
            ArrayAdapter<string> adapter = new ArrayAdapter<string>(_context,Resource.Layout.simple_spinner_item,Resource.Id.tv_item,new string[] { allText });
            // all text on the spinner
            //ArrayAdapter<String> adapter = new ArrayAdapter<String>(_context,Resource.Layout.simple_spinner_item, new String[] { allText });
            Adapter = adapter;
        }
    
        public void OnCancel(IDialogInterface dialog)
        {
            Java.Lang.StringBuffer spinnerBuffer = new Java.Lang.StringBuffer();
            bool someUnselected = false;
            for (int i = 0; i < items.Count; i++)
            {
                if (selected[i] == true)
                {
                    spinnerBuffer.Append(items[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>(_context,Resource.Layout.simple_spinner_item,Resource.Id.tv_item,new string[] { spinnerText });
            Adapter = adapter;
            if (listener != null)
            {
               listener.onItemsSelected(selected);
            }
    
        }
    
    
    }
    
  2. simple_spinner_item.xml:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
      <TextView
        android:id="@+id/tv_item"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
    </LinearLayout>
    

Update:

Here is the codes for using this MultiSpinner:

Main.axml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
  <MultiSpinner.MultiSpinner
    android:id="@+id/mSpinner"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    />
</LinearLayout>

MainActivity.cs:

public class MainActivity : Activity
{
    MultiSpinner mSpinner;
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);
        mSpinner = FindViewById<MultiSpinner>(Resource.Id.mSpinner);
        List<string> items = new List<string> {
            "Android",
            "iOS",
            "UWP"
        };

        mSpinner.SetItems(items, "AllText", null);
    }
}

Upvotes: 1

Related Questions