0

我遇到了一个问题,即 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)
4

1 回答 1

0

尝试DescendantFocusabilityListView. 我认为将其设置为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获取包含的文本并将状态保存在某处。这可能是您正在显示的适配器中的项目。

于 2013-02-01T19:10:19.553 回答