Xamarin.android 多选微调器Xamarin Android

Xamarin.android 多选微调器Xamarin Android,xamarin.android,android-spinner,Xamarin.android,Android Spinner,我使用微调器和arrayAdapter来填充微调器中的项目。我想让微调器可以多选择,但我只选择了一行。我在Google中搜索,Java提供了解决方案,但我不知道如何在Xamarin中实现它 我的代码如下: adapterList= new ArrayAdapter<string>(this, Android.Resource.Layout.SimpleListItemMultipleChoice); spnMultiTest.Adapter = adapterList; adap

我使用微调器和arrayAdapter来填充微调器中的项目。我想让微调器可以多选择,但我只选择了一行。我在Google中搜索,Java提供了解决方案,但我不知道如何在Xamarin中实现它

我的代码如下:

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

spnMultiTest.Adapter = adapterList;
adapterList=newarrayadapter(这是Android.Resource.Layout.SimpleListItemMultipleChoice);
spnMultiTest.Adapter=适配器列表;
我想让微调器可以多选择,但我只选择了一行。我在Google中搜索,Java提供了解决方案,但我不知道如何在Xamarin中实现它

基本上,我只是将代码从转换为Xamarin代码。我已经测试过了,效果很好:

  • 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);
            }
    
        }
    
    
    }
    
    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);
        }
    }
    
    公共类main活动:活动
    {
    多旋子mSpinner;
    创建时受保护的覆盖无效(Bundle savedInstanceState)
    {
    base.OnCreate(savedInstanceState);
    //从“主”布局资源设置视图
    SetContentView(Resource.Layout.Main);
    mSpinner=findviewbyd(Resource.Id.mSpinner);
    列表项=新列表{
    “安卓”,
    “iOS”,
    “UWP”
    };
    mSpinner.SetItems(items,“AllText”,null);
    }
    }
    
    谢谢,现在我有了MultiPiner功能,我可以将其添加到项目中,但我找不到如何转移项目。我需要提出三个选项,即android、ios和uwp。在我的每次试用中,system.nullreferenceexception都会循环。如何添加项目?通过
    转移项目
    ,您的意思是将项目添加到此微调器中吗?如果是,请检查我的更新。
    <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>
    
    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);
        }
    }