在RecyclerView中回收时,项目视图无法正确测量

时间:2016-09-27 22:35:56

标签: android android-recyclerview android-linearlayout

我有一个场景,当视图被回收时,布局不正确。我的行项目布局如下(请注意wrap_content LinearLayout宽度,weightellipsize):

     <LinearLayout
          android:id="@+id/header"
          android:layout_width="wrap_content"       
          android:layout_height="wrap_content"    
          android:orientation="horizontal"
          >
        <TextView
            android:id="@+id/text1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"               
            android:ellipsize="middle"
            android:singleLine="true"
            tools:text="Ann really freaking long last name Droid"
            />
        <TextView
            android:id="@+id/text2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />
        <TextView
            android:id="@+id/text3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />
      </LinearLayout>

期望的行为

    row1 | 1-short-text | 2-text | 3-more-text
    ----------------------------------------------------
    row2 | 1-short-text | 2-text | 3-more-text
    ----------------------------------------------------
    row3 | 1-long-ellipsiz...text | 2-text | 3-more-text
    ----------------------------------------------------
    row4 | 1-tiny | 2-text-longer | 3-more-text-blah
    ----------------------------------------------------

实际行为

    row1 | 1-...et | 2-text | 3-more-text     <-- ellipsized unnecessarily
    ----------------------------------------------------
    row4 | 1-short-text | 2-text | 3-more-text
    ----------------------------------------------------
    row2 | 1-long-ellipsiz...text | 2-text | 3-more-text
    ----------------------------------------------------
    row3 | 1-tiny |    2-text-longer | 3-more-text-blah  <-- spacing
    ----------------------------------------------------

解决此布局问题的最佳方法是什么?注意:它在4.1.1模拟器中工作正常。

2 个答案:

答案 0 :(得分:10)

在这种情况下,TextViews不会重新测量一个已知问题。在ViewHolder中设置数据时,我可以通过执行以下操作来解决此问题:

text1.setText("some-dynamic-text");
text1.requestLayout();  // <-- This is key... requestLayout after setting text.

当视图被回收并且设置了新文本时,它没有正确布局。明确要求重新布局似乎正确地重新计算。

答案 1 :(得分:1)

似乎有效的另一种解决方案是将令人不安的TextView包裹在FrameLayout中。

...
<FrameLayout
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1">
    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="middle"
        android:singleLine="true"/>
</FrameLayout>
...