Commit 1e01f6c6 by 段启岩

话题解析升级

parent 521f8863
......@@ -26,25 +26,38 @@ import cn.yunliyunwai.beyondclouds.data.model.Post;
import cn.yunliyunwai.beyondclouds.databinding.PostItemBinding;
import cn.yunliyunwai.beyondclouds.util.DateUtils;
import cn.yunliyunwai.beyondclouds.util.GlideRoundTransform;
import lombok.Data;
public class DynamicListRecyclerViewAdapter extends BaseQuickAdapter<Post,BaseViewHolder> {
static class TopicLink {
private TopicLink(String topic, int start, int end) {
this.topic = topic;
this.start = start;
this.end = end;
@Data
static class PostLink {
enum LinkType {
TOPIC,
OTHER
}
private int start;
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) {
return new TopicLink(topic, start, end);
public static PostLink of(int start, int end, String content, String link, LinkType linkType) {
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);
public DynamicListRecyclerViewAdapter(int layoutResId) {
......@@ -64,7 +77,7 @@ public class DynamicListRecyclerViewAdapter extends BaseQuickAdapter<Post,BaseVi
static class TopicLinkClickable extends ClickableSpan {
@Override
public void onClick(@NonNull View widget) {
Toast.makeText(widget.getContext(), "点击了话题", Toast.LENGTH_SHORT).show();
Toast.makeText(widget.getContext(), "点击了链接", Toast.LENGTH_SHORT).show();
}
@Override
......@@ -75,26 +88,33 @@ public class DynamicListRecyclerViewAdapter extends BaseQuickAdapter<Post,BaseVi
}
private void parseAndSetContent(TextView textView, String content) {
content = content.replace("<br>", "\n");
content = content.replace("<br/>", "\n");
SpannableStringBuilder builder = new SpannableStringBuilder();
List<TopicLink> topicLinkList = new ArrayList<>(10);
List<PostLink> postLinkList = new ArrayList<>(10);
Matcher matcher = TOPIC_LINK_PATTERN.matcher(content);
while (matcher.find()) {
String topic = matcher.group(1);
topicLinkList.add(TopicLink.of(topic, matcher.start(), matcher.end()));
String link = matcher.group(1);
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;
for (TopicLink topicLink: topicLinkList) {
String plainText = content.substring(currentIndex, topicLink.start);
for (PostLink postLink : postLinkList) {
String plainText = content.substring(currentIndex, postLink.start);
if (!TextUtils.isEmpty(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);
builder.append(topicSpannable);
currentIndex = topicLink.end;
currentIndex = postLink.end;
}
if (currentIndex != content.length()) {
builder.append(content.substring(currentIndex));
......
......@@ -42,25 +42,14 @@
android:textColor="@color/colorTextAccent"
app:layout_constraintTop_toBottomOf="@id/barrier_user_info"
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
android:id="@+id/barrier_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
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_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