我在 TextViews 中插入 ImageSpan,它是 RecyclerView 的一部分。大多数情况下它工作得很好,但是当你上下滚动时,有时 TextView 的高度是错误的,没有明显的原因 - 垂直空白太多。
在特定设备上的此布局中,具有 1 行文本的 TextView 的正确高度为 48,错误高度为 80(我从 HierarchyViewer 获得这些值)。有趣的是,带有 1 行文本(包括 ImageSpan)的 TextView 的正确高度是 80。所以似乎正在发生的事情是,当 TextView 被 RecyclerView 回收时,它有时会保持代表其旧内容的高度(其中包括图像跨度)。
此屏幕截图显示“Anore”和“Halal blahs”TextView 的高度为 80 像素,这是错误的。“Hello” TextView 在 48 像素处是正确的。
在调查这个问题时,我打开了 DDMS 并运行了“转储 UI 层次结构”,发生了一些有趣的事情:TextView 高度在运行中自行纠正:
这是非常令人信服的证据,表明问题是更新文本后 TextView 没有正确布局,所以我尝试了各种方法在 TextView 及其父视图上调用 forceLayout() 和 invalidate() ,但没有帮助。
我尝试用 ListView 替换 RecyclerView,没有运气。我尝试让所有 ImageSpan 使用相同的可绘制对象,但没有运气。
我运行了 HierarchyViewer,但它并没有像 UI Automator 那样“修复”布局。甚至当我按下“无效布局”和“请求布局”按钮时也没有。
我没有做任何花哨的设置 ImageSpans:
SpannableStringBuilder stringBuilder = new SpannableStringBuilder( rawText );
for( int i = inlineImages.size() - 1; i >= 0; i-- ) {
InlineImage img = inlineImages.get( i );
stringBuilder.insert( img.idx, "x" );
ImageSpan span = new ImageSpan( context, img.drawable );
stringBuilder.setSpan( span, img.idx, img.idx + 1, 0 );
}
holder.mText.setText( stringBuilder );
// none of this helps
holder.mText.forceLayout();
holder.mText.requestLayout();
holder.mText.invalidate();
这是每个列表项布局的相关部分:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:id="@+id/speech_bubble"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/speech_bubble_right"
android:layout_marginLeft="40dp"
>
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_toRightOf="@id/timestamp"
/>
</LinearLayout>
</RelativeLayout>
我尝试使 TextView 父级 (LinearLayout) 上的布局无效并强制布局,但它什么也没做。
我尝试将布局编辑为字面意思:
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
/>
..问题仍然存在。这绝对是 TextView 本身的错。