如果微调器位于ListView内,则在选择项目后MvxSpinner失去焦点

时间:2014-08-07 09:57:25

标签: android xamarin.android mvvmcross

我有一个ListView,它通过视图中的CustomAdapter动态生成ListItems。 ListView包含不同的InputControls,比如EditTexts,DatePickers,MvxSpinners等。

当用户从MvxSpinner中选择一个项目时,焦点被设置为屏幕上显示的第一个可聚焦的InputControl beeing。

如何确保在用户从Spinner中选择一个项目后,Spinner会保持或获得焦点?

这是SpinnerListViewItem中的xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="left"
    >
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Text"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:clickable="false"
        local:MvxBind="Text Beschriftung"
        style="@style/CardLabelMediumStyle" />
    <Mvx.MvxSpinner
        local:MvxBind="ItemsSource ItemsSource;SelectedItem SelectedItem"
        local:MvxItemTemplate="@layout/item_text_spinner"
        local:MvxDropDownItemTemplate="@layout/item_text_spinner_dropdown"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:clickable="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

自定义适配器的代码:

    public class PruefpunkteAdapter : MvxAdapter
    {
        IDictionary<Type, TypeDescriptor> types = new Dictionary<Type, TypeDescriptor>();

        public PruefpunkteAdapter(Context context, IMvxAndroidBindingContext bindingContext)
            : base(context, bindingContext)
        {
            types.Add(typeof(FormularpunktTextBox), new TypeDescriptor() { TempldateId = Resource.Layout.ListItem_PruefberichtFormularpunktTextBox, ViewType = 5 });
            types.Add(typeof(FormularpunktSpinner), new TypeDescriptor() { TempldateId = Resource.Layout.ListItem_PruefberichtFormularpunktSpinner, ViewType = 15 });
            /* about 15 more types added */
        }

        public override int GetItemViewType(int position)
        {
            var item = GetRawItem(position);

            var descriptor = types[item.GetType()];
            return descriptor.ViewType;
        }

        public override int ViewTypeCount
        {
            get { return types.Count; }
        }

        protected override View GetBindableView(View convertView, object source, int templateId)
        {
            return base.GetBindableView(convertView, source, types[source.GetType()].TempldateId);
        }

        private class TypeDescriptor
        {
            public int ViewType;
            public int TempldateId;
        }
    }

1 个答案:

答案 0 :(得分:1)

在自定义适配器中,您可以为Spinner添加如下代码:

spinner.setFocusable(true);
spinner.setFocusableInTouchMode(true);
spinner.FocusChangeListener += (s, e) =>
{
    bool hasFocus = e.HasFocus;
    if (hasFocus) {
        YourActivity.this.spinner.performClick();
    }
}

可能有点关闭“YourActivity.this.spinner”部分而没有看到你的代码目前看起来如何,但基本上只需要运行performClick();在你的微调器上。