ListView行失去焦点

时间:2013-02-01 16:56:27

标签: android android-listview xamarin.android

我遇到一个问题,其中EditText在ListView中排成一行。

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

我怎么能:

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

我试过了:

  • 对ListView进行子类化并设置选择OnSizeChanged,OnFinishInflate等。
  • 拦截EditText失去焦点并重置列表选择。 (问题是视图被回收)

目前正在使用:

  • MonoDevelop 3.0.6
  • Mono for Android:4.4.55
  • Android SDK:4.0(API级别14)

1 个答案:

答案 0 :(得分:0)

尝试使用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>

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