【问题标题】:How to get all the values from a spinner within a ListView Custom Adapter如何从 ListView 自定义适配器中的微调器获取所有值
【发布时间】:2012-05-13 04:58:06
【问题描述】:

我试图在 ListView 中创建 Spinner,但我不知道如何获取字符串列表中每个 Spinner 的所有值。这是适配器的代码:

public class CustomizeColumnsListAdapter : BaseAdapter
{
    private Activity context;
    private int columnsCount;
    public List<string> fieldsValues;

    public CustomizeColumnsListAdapter(Activity context, int columnsCount)
    {
        this.context = context;
        this.dataObject = dataObject;
        this.columnsCount = columnsCount;
    }

    public override View GetView(int position, View convertView, ViewGroup parent)
    {
        RelativeLayout view = (convertView
                        ?? context.LayoutInflater.Inflate(
                                Resource.Layout.customize_column_list_item, parent, false)
                    ) as RelativeLayout;

        try
        {
            string[] sortingColumsItems = {"None", "Id", "Customer Name", "Customer Number", "City", "Address", "Credit Limit", "Contact Name", "Phone Number", "Mail"};
            ArrayAdapter<string> spinnerArrayAdapter = new ArrayAdapter<string>(context, Android.Resource.Layout.SimpleSpinnerItem, sortingColumsItems);
            spinnerArrayAdapter.SetDropDownViewResource(Android.Resource.Layout.SimpleSpinnerDropDownItem);
            view.FindViewById<Spinner>(Resource.Id.cboCCD).Adapter = spinnerArrayAdapter;
            view.FindViewById<Spinner>(Resource.Id.cboCCD).Enabled = true;

            if(columnsCount>=position)
            {
                string columnIndex = (position + 1).ToString();
                view.FindViewById<TextView>(Resource.Id.lblColumn).Text = columnIndex;
            }

        }
        catch (System.Exception ex)
        {
            Toast.MakeText(context, ex.ToString(), ToastLength.Short).Show(); 
        }

        return view;            

    }

    public override int Count
    {
        get { return columnsCount; }
    }

    public override Java.Lang.Object GetItem(int position)
    {
        return null;
    }

    public override long GetItemId(int position)
    {
        return position;
    }

【问题讨论】:

    标签: listview custom-controls spinner xamarin.android


    【解决方案1】:

    如果您希望向用户展示一种从列表的每一行启动微调器的方法,一种方法是使用自定义视图,例如以下 SpinnerRow:

    public class SpinnerRow : RelativeLayout, View.IOnClickListener, IDialogInterfaceOnClickListener
    {
        #region Member Variables
        SpinnerItemSelectedDelegate _spinnerItemSelected;
        SpinnerPosSelectedDelegate _spinnerPosSelected;
    
        private TextView _label;
        private TextView _value;
        private ImageButton _edit;
        private string[] _options = new String[0];
        private int _position;
    
        private AlertDialog.Builder _builder;
        #endregion
    
        #region Construction
        public SpinnerRow (Context context) :
            base (context)
        {
            Initialize (context, null);
        }
    
        public SpinnerRow (Context context, IAttributeSet attrs) :
            base (context, attrs)
        {
            Initialize (context, attrs);
        }
    
        protected SpinnerRow (IntPtr doNotUse, Android.Runtime.JniHandleOwnership owner) :
            base (doNotUse, owner)
        {
            //Do nothing
        }
    
        protected void Initialize (Context context, IAttributeSet attrs)
        {
            Inflate (context, Resource.Layout.SpinnerRow, this);
    
            _label = FindViewById<TextView>(Resource.Id.editscope_addons_spinner_row_lbl);
            _value = FindViewById<TextView>(Resource.Id.editscope_addons_spinner_row_spin_lbl);
            _edit = FindViewById<ImageButton>(Resource.Id.editscope_addons_spinner_row_button);
    
            _label.Text = "Row label";
            string[] options = {"None", "Id", "Customer Name", "Customer Number", "City", "Address", "Credit Limit", "Contact Name", "Phone Number", "Mail"};
            _options = options;
    
            _edit.SetOnClickListener(this);
    
            _builder = new AlertDialog.Builder(context);
            _builder.SetTitle(_label.Text);
        }
        #endregion
    
        public virtual void OnClick(View v)
        {
            _builder.SetSingleChoiceItems(_options, _position, this);
            _builder.Create().Show();
        }
    
        public virtual void OnClick(IDialogInterface dialog, int position)
        {
            Position = position;
            _value.Text = _options[_position];
    
            dialog.Dismiss();
        }
    
        public int IndexOf(string option)
        {
            int numOptions = _options.Length;
            for (int i = 0; i < numOptions; i++)
            {
                if (_options[i].ToLower() == option.ToLower())
                    return i;
            }
    
            return IntentConstants.INVALID_POSITION;
        }
    
        public bool Contains(string option)
        {
            return IndexOf(option) != IntentConstants.INVALID_POSITION;
        }
    
        #region Properties
        public string Text
        {
            get { return _label.Text; }
            set { _label.Text = value; }
        }
    
        public int Position
        {
            get { return _position; }
            set
            {
                _position = value;
                if (_position == IntentConstants.INVALID_POSITION)
                {
                    _value.Text = NotSelectedText;
                    if (OnSelected != null)
                        OnSelected("");
                }
                else if (_options != null && _options.Length > 0)
                {
                    _value.Text = _options[_position];
                    if (OnSelected != null)
                        OnSelected(_options[_position]);
                }
    
                if (OnPosSelected != null)
                    OnPosSelected(_position);
            }
        }
    
        public string ValueText
        {
            get { return _value.Text; }
        }
    
        public String[] Options
        {
            get { return _options; }    
            set 
            { 
                _options = value;
    
                //Reset the current position so the text is updated
                int curPos = Position;
                _position = IntentConstants.INVALID_POSITION;
                Position = curPos;
            }
        }
    
        public SpinnerItemSelectedDelegate OnSelected
        {
            get { return _spinnerItemSelected; }
            set { _spinnerItemSelected = value; }
        }
    
        public SpinnerPosSelectedDelegate OnPosSelected
        {
            get { return _spinnerPosSelected; }
            set { _spinnerPosSelected = value; }
        }
        #endregion
    }
    

    您将在上面的 CustomizeColumnsListAdapter 的 GetView() 中初始化此视图。

    在该方法中您可能需要考虑的另一件事是 Android 推荐的 ViewHolder 模式:http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      相关资源
      最近更新 更多