Commit 1e01f6c6 by 段启岩

话题解析升级

parent 521f8863
...@@ -26,25 +26,38 @@ import cn.yunliyunwai.beyondclouds.data.model.Post; ...@@ -26,25 +26,38 @@ import cn.yunliyunwai.beyondclouds.data.model.Post;
import cn.yunliyunwai.beyondclouds.databinding.PostItemBinding; import cn.yunliyunwai.beyondclouds.databinding.PostItemBinding;
import cn.yunliyunwai.beyondclouds.util.DateUtils; import cn.yunliyunwai.beyondclouds.util.DateUtils;
import cn.yunliyunwai.beyondclouds.util.GlideRoundTransform; import cn.yunliyunwai.beyondclouds.util.GlideRoundTransform;
import lombok.Data;
public class DynamicListRecyclerViewAdapter extends BaseQuickAdapter<Post,BaseViewHolder> { public class DynamicListRecyclerViewAdapter extends BaseQuickAdapter<Post,BaseViewHolder> {
static class TopicLink { @Data
private TopicLink(String topic, int start, int end) { static class PostLink {
this.topic = topic; enum LinkType {
this.start = start; TOPIC,
this.end = end; OTHER
} }
private int start; private int start;
private int end; private int end;
private String topic; private String content;
private String link;
private LinkType linkType;
public PostLink(int start, int end, String content, String link, LinkType linkType) {
this.start = start;
this.end = end;
this.content = content;
this.link = link;
this.linkType = linkType;
}
public static TopicLink of(String topic, int start, int end) { public static PostLink of(int start, int end, String content, String link, LinkType linkType) {
return new TopicLink(topic, start, end); return new PostLink(start, end, content, link, linkType);
} }
} }
private static final Pattern TOPIC_LINK_PATTERN = Pattern.compile("<a href=.+>(#.+#)</a>"); private static final Pattern TOPIC_LINK_PATTERN = Pattern.compile("<a.+?href=['\"](.+?)['\"]>(.+?)</a>");
private static final String TOPIC_BARRIER = "#";
private static final GlideRoundTransform glideRoundTransform = new GlideRoundTransform(3); private static final GlideRoundTransform glideRoundTransform = new GlideRoundTransform(3);
public DynamicListRecyclerViewAdapter(int layoutResId) { public DynamicListRecyclerViewAdapter(int layoutResId) {
...@@ -64,7 +77,7 @@ public class DynamicListRecyclerViewAdapter extends BaseQuickAdapter<Post,BaseVi ...@@ -64,7 +77,7 @@ public class DynamicListRecyclerViewAdapter extends BaseQuickAdapter<Post,BaseVi
static class TopicLinkClickable extends ClickableSpan { static class TopicLinkClickable extends ClickableSpan {
@Override @Override
public void onClick(@NonNull View widget) { public void onClick(@NonNull View widget) {
Toast.makeText(widget.getContext(), "点击了话题", Toast.LENGTH_SHORT).show(); Toast.makeText(widget.getContext(), "点击了链接", Toast.LENGTH_SHORT).show();
} }
@Override @Override
...@@ -75,26 +88,33 @@ public class DynamicListRecyclerViewAdapter extends BaseQuickAdapter<Post,BaseVi ...@@ -75,26 +88,33 @@ public class DynamicListRecyclerViewAdapter extends BaseQuickAdapter<Post,BaseVi
} }
private void parseAndSetContent(TextView textView, String content) { private void parseAndSetContent(TextView textView, String content) {
content = content.replace("<br>", "\n");
content = content.replace("<br/>", "\n");
SpannableStringBuilder builder = new SpannableStringBuilder(); SpannableStringBuilder builder = new SpannableStringBuilder();
List<TopicLink> topicLinkList = new ArrayList<>(10); List<PostLink> postLinkList = new ArrayList<>(10);
Matcher matcher = TOPIC_LINK_PATTERN.matcher(content); Matcher matcher = TOPIC_LINK_PATTERN.matcher(content);
while (matcher.find()) { while (matcher.find()) {
String topic = matcher.group(1); String link = matcher.group(1);
topicLinkList.add(TopicLink.of(topic, matcher.start(), matcher.end())); String linkContent = matcher.group(2);
PostLink.LinkType linkType =
(linkContent.startsWith(TOPIC_BARRIER) && linkContent.endsWith(TOPIC_BARRIER))
? PostLink.LinkType.TOPIC
: PostLink.LinkType.OTHER;
postLinkList.add(PostLink.of(matcher.start(), matcher.end(), linkContent, link, linkType));
} }
int currentIndex = 0; int currentIndex = 0;
for (TopicLink topicLink: topicLinkList) { for (PostLink postLink : postLinkList) {
String plainText = content.substring(currentIndex, topicLink.start); String plainText = content.substring(currentIndex, postLink.start);
if (!TextUtils.isEmpty(plainText)) { if (!TextUtils.isEmpty(plainText)) {
builder.append(plainText); builder.append(plainText);
} }
SpannableString topicSpannable = new SpannableString(topicLink.topic); SpannableString topicSpannable = new SpannableString(postLink.content);
topicSpannable.setSpan(new TopicLinkClickable(),0, topicSpannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); topicSpannable.setSpan(new TopicLinkClickable(),0, topicSpannable.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.append(topicSpannable); builder.append(topicSpannable);
currentIndex = topicLink.end; currentIndex = postLink.end;
} }
if (currentIndex != content.length()) { if (currentIndex != content.length()) {
builder.append(content.substring(currentIndex)); builder.append(content.substring(currentIndex));
......
...@@ -42,25 +42,14 @@ ...@@ -42,25 +42,14 @@
android:textColor="@color/colorTextAccent" android:textColor="@color/colorTextAccent"
app:layout_constraintTop_toBottomOf="@id/barrier_user_info" app:layout_constraintTop_toBottomOf="@id/barrier_user_info"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/blog_cover"/> />
<ImageView
android:layout_marginTop="10dp"
android:id="@+id/blog_cover"
app:layout_constraintTop_toBottomOf="@id/barrier_user_info"
app:layout_constraintEnd_toEndOf="parent"
android:layout_width="82dp"
android:layout_height="55dp"
android:maxWidth="82dp"
android:maxHeight="55dp"
android:src="@drawable/pic1" />
<androidx.constraintlayout.widget.Barrier <androidx.constraintlayout.widget.Barrier
android:id="@+id/barrier_content" android:id="@+id/barrier_content"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:barrierDirection="bottom" app:barrierDirection="bottom"
app:constraint_referenced_ids="txt_abstract,blog_cover" app:constraint_referenced_ids="txt_content"
tools:layout_editor_absoluteX="12dp" tools:layout_editor_absoluteX="12dp"
tools:layout_editor_absoluteY="16dp" /> tools:layout_editor_absoluteY="16dp" />
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment