链接不一致
Linkify inconsistency
我有一个列表,其中包含像 Instagram 这样的照片,其中包含指向主题标签和使用 #
和 @
的用户的链接的文本,我正在使用 Linkify 来完成这项工作。
我列表中的第一项 获得链接正确 8/10 次,但其他时候只是纯文本。其他项目的链接总是正确的。
基础适配器
// 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);
}
}
我已经解决了
问题来自于所有线程没有同时完成。我有一项任务是获取有关我的照片的信息,另一项任务是获取附加到照片的主题标签(从与实际对象的关系)。
解决方案是确保当我的 for 循环中的最后一个对象添加到对象列表时所有信息都加载到适配器中确保没有对象added/changed 适配器更新后。
我有一个列表,其中包含像 Instagram 这样的照片,其中包含指向主题标签和使用 #
和 @
的用户的链接的文本,我正在使用 Linkify 来完成这项工作。
我列表中的第一项 获得链接正确 8/10 次,但其他时候只是纯文本。其他项目的链接总是正确的。
基础适配器
// 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);
}
}
我已经解决了
问题来自于所有线程没有同时完成。我有一项任务是获取有关我的照片的信息,另一项任务是获取附加到照片的主题标签(从与实际对象的关系)。
解决方案是确保当我的 for 循环中的最后一个对象添加到对象列表时所有信息都加载到适配器中确保没有对象added/changed 适配器更新后。