我有一个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;
}
}
答案 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();在你的微调器上。