android - 链接范围从 ListView 的 convertView 中丢失

标签 android listview textview linkify spannablestring

为什么 ListView 中的链接在滚动时丢失了?从调试中可以清楚地看出,不会在 convertViewTextView 上第二次添加跨度。

这是从适配器的 getView 调用的一段代码。

    ...
    String body = MyItemDetails.getBody(); // String to linkify

    final Spannable spannable = MyCustomUri.addHashtagSpans(context, body);
    viewHolder.textView.setText(spannable);

    viewHolder.textView.setTextIsSelectable(true); // adds additional spans
    viewHolder.textView.setMovementMethod(ArrowKeyMovementMethod.getInstance());
    viewHolder.textView.setAutoLinkMask(Linkify.WEB_URLS);
    ...

MyCustomUri.addHashtagSpans() 使用 MyCustomSpan 和扩展 URLSpan 创建一个 SpannableString

问题是,当我在 ListView 中上下滚动时,链接丢失了。而当屏幕第一次打开时,它设置正确。

现在我通过禁用 convertView 的重用做了一个肮脏的修复 :( 有什么想法可以更好地解决这个问题吗?

最佳答案

当 textview 的数据被写入包裹以保留时,一些可跨越的信息可能会丢失。

参见 TextView.onSaveInstanceState() , TextView.onRestoreInstanceState() , 和 TextView.SavedState .

确定 android 将保留和不保留的内容通常会非常令人沮丧。我通常只是在我的 View 中使用 setSaveEnabled(false) 来禁用基本小部件不可预测的默认行为。

此外,viewholder 模式仅真正用于保留 View /布局实例层次结构。为了让您不必在每次 getView() 时膨胀或查找您的 View 。从 getView() 呈现 View 时,更新 View 数据始终是您的责任。

您不需要完全禁用 viewholder 模式,只需在每次 getView() 时更新文本,就像您可能已经在做的那样。

关于android - 链接范围从 ListView 的 convertView 中丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21183448/

相关文章:

ios - 如何使用 Swift 从 ViewController 获取 TextView 的文本值?

android - 如何断言可组合测试的下一个启动 Activity ?

c# - 对 ListView 中的条目进行排序

java - 向下和向上滑动 ListView 并附加数据(最初隐藏,然后单击后显示)

java - 什么是 textview.setTextSize()?

android - 是否可以在EditText中选择所有文本时忽略特殊字符?

android - 缩放模拟器大小

android - java.lang.NoClassDefFoundError : Failed resolution of: Lcom/google/android/gms/auth/api/signin/internal/zzz; 错误

android - RingtonePreference 默认值

java - 多次调用自定义 ListView 适配器 getView 方法,并且顺序不一致