是否有可能生成一个自动保留其状态的`EditText`对列表?

时间:2014-06-02 00:24:13

标签: android android-layout listview android-listview android-view

我遇到了一系列非常令人沮丧的问题。我想要一个明确的解决方案;因此,我将奖励这个问题的赏金。

要求

  1. 生成EditText个视图对的列表,这些视图会在方向更改(屏幕旋转)时自动保留其值。

  2. EditText对的数量是在运行时确定的。

  3. 失败方法:使用ListView

    使用ListView ArrayAdapter。数组适配器使用布局生成每对TextView视图。 ListView项的XML可能显示为:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent" >
    
      <EditText
        android:id="@+id/edit_first"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    
      <EditText
        android:id="@+id/edit_second"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    
    </LinearLayout>
    

    ArrayAdapter只会让每个视图的布局都膨胀。

      @Override
      public View getView(int position, View convertView, ViewGroup parent) 
      {
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
        View row = inflater.inflate(R.layout.listview_pair, parent, false);
    

    在方向更改时,不会保留输入EditText的值。由于EditText视图是通过ArrayAdapter实例化的,因此Android运行时无法自动预先填充EditText视图及其在轮换之前的最后状态。这意味着我们必须手动保存/恢复用户输入 - 失败的要求#1。

    失败方法:使用TableLayoutTableRow s

    我们可以为每个ListView对充气TableRow布局,而不是使用EditText,并将其附加到TableLayout。由于我们只知道运行时对的数量(根据需求#2),我们必须以编程方式实例化布局。类似的东西:

    for (int i = 0; i < numPairs; ++i)
    {
      TableRow row = (TableRow) View.inflate(this, R.layout.tablerow_pair, null);
      table.addView(row);
    }
    

    这也无法保持方向变化的状态。每对EditText视图与Id中的所有其他EditText对具有相同的ListView个视图。发生这种情况是因为我们为列表中的每个项目实例化相同的布局;因此,它们都具有相同的Id s。在轮播时,Android会为每对EditText值赋予相同的值,因为它们共享相同的Id

    重演

    那么,有没有办法创建一个EditText对列表,在方向更改时自动保留其状态?似乎必须有一种方法,但研究这个问题很困难,因为它是一个相当专业的用例。我很乐意为那些可以给我一个很好解释这种情况的人奖励一些赏金。

1 个答案:

答案 0 :(得分:2)

您可以use setId()使用EditText小部件,无论是通过构造函数创建这些小部件还是通过布局膨胀(根据您的第二个策略)。使用generateViewId()获取不同的视图ID。