【问题标题】:ListView row loses focusListView 行失去焦点
【发布时间】:2013-02-01 16:56:27
【问题描述】:

我遇到了一个问题,即 EditText 在 ListView 的一行中。

用户可以在 EditText 中输入多行文本。每个新行都会导致 Row 展开,ListView 刷新/更新。

我该怎么做:

  • A) 阻止列表视图整体更新?
  • B) 将列表视图重新聚焦到前一个文本视图的位置(视图被回收)
  • C) 更好的方法?

我试过了:

  • 继承 ListView 并设置选择 OnSizeChanged、OnFinishInflate 等。
  • 拦截 EditText 的失去焦点并在那里重置列表选择。 (问题是视图被回收)

目前使用:

  • MonoDevelop 3.0.6
  • Android 单声道:4.4.55
  • Android SDK:4.0(API 级别 14)

【问题讨论】:

    标签: android android-listview xamarin.android


    【解决方案1】:

    尝试使用ListView 上的DescendantFocusability 属性。我认为将其设置为DescendantFocusability.AfterDescendants,可能会解决您的焦点和调整大小问题。

    它适用于我的小样本:

    MainActivity.cs

    using Android.App;
    using Android.Views;
    using Android.Widget;
    using Android.OS;
    
    namespace ListViewTests
    {
        [Activity(Label = "ListViewTests", MainLauncher = true, Icon = "@drawable/icon")]
        public class Activity1 : Activity
        {
            protected override void OnCreate(Bundle bundle)
            {
                base.OnCreate(bundle);
    
                // Set our view from the "main" layout resource
                SetContentView(Resource.Layout.Main);
    
                var lv = FindViewById<ListView>(Resource.Id.listView);
                lv.Adapter = new ArrayAdapter(this, Resource.Layout.ListViewItem, Resource.Id.textView, new [] {"1", "2"});
                lv.DescendantFocusability = DescendantFocusability.AfterDescendants;
            }
        }
    }
    

    ListViewItem.axml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
      <TextView
        android:id="@+id/textView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />
      <EditText
        android:id="@+id/editText"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        />
    </LinearLayout>
    

    但是,您对视图被回收的问题可能需要做更多的工作。您需要以某种方式保存视图的状态,并在它们再次创建时恢复状态。因此,对于适配器中的每个项目,您都需要连接到视图的事件。 IE。对于EditText,您想连接到TextChanged 或AfterTextChanged 以获取包含的文本并将状态保存在某处。这可能是您正在显示的适配器中的项目。

    【讨论】:

      猜你喜欢
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 2023-03-09
      • 1970-01-01
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多