5

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

这是一段从适配器调用的代码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()创建一个SpannableStringwith MyCustomSpanwith extends URLSpan

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

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

4

4 回答 4

1

你好使用这个自定义类

public class MyCustomSpannable extends ClickableSpan {
String Url;
Context mContext;

public MyCustomSpannable(String Url, Context context) {
    this.Url = Url;
    mContext = context;
}

@Override
public void updateDrawState(TextPaint ds) {
    // Customize your Text Look if required
    ds.setColor(mContext.getResources().getColor(R.color.red_text));
    ds.setFakeBoldText(true);
    // ds.setStrikeThruText(true);
    ds.setTypeface(CommonFunctios.getfontNormal(mContext));
    // ds.setUnderlineText(true);
    // ds.setShadowLayer(10, 1, 1, Color.WHITE);
    // ds.setTextSize(15);
}

@Override
public void onClick(View widget) {
}

public String getUrl() {
    return Url;
}
}

并在适配器中用这个替换你的代码

String text = holder.txt_terms.getText().toString();
SpannableStringBuilder stringBuilder = new SpannableStringBuilder(text);
MyCustomSpannable customSpannable = new MyCustomSpannable(text,
            mcontext) {

        @Override
        public void onClick(View widget) {
            Log.e("on click", "message");
            ((OpticalOffersActivity) mcontext).callDialogBox(position);
        }
    };
    stringBuilder.setSpan(customSpannable, 0, text.length(),
            Spannable.SPAN_INCLUSIVE_INCLUSIVE);

    holder.txt_terms.setText(stringBuilder, BufferType.SPANNABLE.SPANNABLE);
    holder.txt_terms.setMovementMethod(LinkMovementMethod.getInstance());

希望它会帮助你。

于 2014-01-23T06:02:43.610 回答
1

当 textview 的数据写入包裹以进行保留时,一些可扩展的信息可能会丢失。

请参阅TextView.onSaveInstanceState()TextView.onRestoreInstanceState()TextView.SavedState

确定 android 将保留哪些内容和不保留哪些内容通常会非常令人沮丧。我经常只是setSaveEnabled(false)根据我的观点来禁用基本小部件的不可预测的默认行为。

此外,viewholder 模式仅用于保留视图/布局实例层次结构。为了使您不必每次膨胀或查找您的视图getView()。从getView().

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

于 2014-01-21T03:22:11.113 回答
1
if(convertView==null)
    {

        convertView.setTag(holder);
    }
else
    {
            holder = (ViewHolder)convertView.getTag();
    }




 ...
        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);
        ...

该可扩展代码必须放在getView()方法中的 if-else 循环之外,就像我在上面的代码中所做的那样。

于 2014-01-23T10:15:26.137 回答
1

这里有几个问题,所以让我一次解决一个。您直接询问的问题(链接消失)是一个副作用,TextView即当您还手动将自己的跨度添加到文本时,自动链接行为不一定能很好地工作......最好不要用它。删除setAutoLinkMask()触发器,消失的链接问题将消失。

相反,您可以轻松地将相同的网络链接行为直接添加到您的文本跨度中Linkify。但是,这只是您的问题的一部分。您选择的MovementMethod与可点击链接并不真正兼容。它(部分)现在在您的代码中工作的原因是因为自动链接掩码导致MovementMethod视图在引擎盖下被秘密按摩到LinkMovementMethod...然后在视图被回收后被重置。我通常使用的模式(应用于您的代码示例)是:

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

addLinkMovementMethod(textView);

我的助手在哪里addLinkMovementMethod(),看起来像这样:

private void addLinkMovementMethod(TextView t) {
    MovementMethod m = t.getMovementMethod();

    if ((m == null) || !(m instanceof LinkMovementMethod)) {
        if (t.getLinksClickable()) {
            t.setMovementMethod(LinkMovementMethod.getInstance());
        }
    }
}

如果没有必要,这只是避免在每个视图回收时重置值。前面的代码块将为您提供正确单击且永不消失的链接...

但是,我从您调用的方法猜测您还试图使列表中的链接文本成为可选(例如调用setTextIsSelectable()并选择ArrowKeyMovementMethod)。MovementMethod由于我上面讨论的问题,这变得有点棘手。为了创建一个MovementMethod同时支持链接点击和文本选择的内容,我将引导您查看有关该主题的现有 SO 帖子,其中包括有关您需要进行的自定义的示例代码:TextView 可以选择并包含链接吗?

于 2014-01-26T05:35:54.637 回答