【问题标题】:Linkify inconsistency链接不一致
【发布时间】:2015-06-24 14:53:57
【问题描述】:

我有一个列表,其中包含 Instagram 之类的照片,其中包含指向主题标签的链接的文本以及使用 #@ 的用户,我正在使用 Linkify 来完成这项工作。

我列表中的 第一项 获得正确的链接 8/10 次,但其他时间只是纯文本。其他项目的链接总是正确的。

BaseAdapter

// holder is a ViewHolder class holding my row views
// holder.photo is a ParseFile subclass object 
// holder.photo.hashtags is an arraylist with objects
// holder.photo.comment() is a getString("key") from ParseObject
// hashtags is a String with hashtags, for example "#hashtag #anotherhashtag"

holder.hashtag.setText(hashtags, TextView.BufferType.SPANNABLE);
holder.title.setText(holder.photo.comment(), TextView.BufferType.SPANNABLE);
StringUtils.linkify(activity, holder.photo.hashtags, new TextView[]{ holder.hashtag, holder.title });

StringUtils

public static void linkify(Activity activity, List<Hashtag> hashtags, TextView[] textViews ) {
    for (TextView t : textViews) {

        // currently only using hashtags
        Pattern tagMatcher = Pattern.compile("[#]+[A-Za-z0-9-_]+\\b");

        // Linkify url
        String newActivityURL = "app://";

        // Add links
        Linkify.addLinks(t, tagMatcher, newActivityURL);

        // Get spannable
        Spannable spannable = (Spannable) t.getText();
        URLSpan[] spans = spannable.getSpans(0, spannable.length(), URLSpan.class);

        // Replace text with span
        for (URLSpan span : spans) {
            int start = spannable.getSpanStart(span);
            int end = spannable.getSpanEnd(span);
            spannable.removeSpan(span);

            // Hashtag is a ParseObject subclass
            Hashtag selectedHashtag = null;
                for (Hashtag h : hashtags) {
                    // Fix url for clickable link
                    String URL = span.getURL().replace("app://" + "#", "");
                    if (URL.equals(h.getObjectId())) {
                        selectedHashtag = h;
                    }
                }

                if (selectedHashtag != null) {
                    span = new URLSpanNoUnderline(a, selectedHashtag, selectedHashtag.name());
                    spannable.setSpan(span, start, end, 10);
                }
            }
        }

URLSpanNoUnderline

class URLSpanNoUnderline extends HashtagSpan {

    private Activity a;

    public URLSpanNoUnderline(Activity a, Hashtag h, String p_Url) {
        super(p_Url, h);
        this.a = a;
    }

    @Override
    public void onClick(View v) {
        HashtagActivity.hashtag = hashtag;
        // Start activity
    }


    public void updateDrawState(TextPaint p_DrawState) {
        super.updateDrawState(p_DrawState);
        p_DrawState.setUnderlineText(false);
        p_DrawState.setFakeBoldText(true);
    }
}

【问题讨论】:

  • 你能解释一下holder.hashtag.setText(hashtags, TextView.BufferType.SPANNABLE) 发生了什么吗?我不知道setText 能够接收 ArrayList。
  • 抱歉,hashtags 是一个包含所有主题标签的普通字符串(带有hashtags = hashtags + ", " + newHashtag 流的简单数组列表循环。
  • 你能发布一些有效和无效的例子
  • 没必要。主题标签/用户要么显示为主题标签/用户,要么显示为正常未触及的文本。

标签: android android-listview baseadapter linkify


【解决方案1】:

我已经解决了。

问题来自所有未同时完成的线程。我有一项任务会获取有关我的照片的信息,另一项任务会获取附加到照片的主题标签(从与实际对象的关系)。

解决方案是确保当我的 for 循环中的最后一个对象添加到对象列表中时所有信息都加载到适配器中确保在适配器之后没有添加/更改任何对象已更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多