Reimplemented parsing comments using recursion to parse all the child comments. Reimplemented CommentRecyclerView (some methods need proper implementation. Minor bugs fixed.

This commit is contained in:
Alex Ning 2019-06-18 00:01:15 +08:00
parent 502cbe02ba
commit 25f2a35d22
11 changed files with 438 additions and 142 deletions

Binary file not shown.

Binary file not shown.

View File

@ -61,7 +61,6 @@ dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.5.0' implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-scalars:2.4.0' implementation 'com.squareup.retrofit2:converter-scalars:2.4.0'
implementation 'jp.wasabeef:glide-transformations:4.0.0' implementation 'jp.wasabeef:glide-transformations:4.0.0'
implementation 'com.muditsen.multilevelrecyclerview:multilevelview:1.0.0'
implementation 'com.google.dagger:dagger:2.17' implementation 'com.google.dagger:dagger:2.17'
annotationProcessor 'com.google.dagger:dagger-compiler:2.17' annotationProcessor 'com.google.dagger:dagger-compiler:2.17'
implementation 'com.jakewharton:butterknife:10.1.0' implementation 'com.jakewharton:butterknife:10.1.0'

View File

@ -3,7 +3,6 @@ package ml.docilealligator.infinityforreddit;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Bundle; import android.os.Bundle;
import android.util.Log;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.widget.EditText; import android.widget.EditText;
@ -70,7 +69,6 @@ public class CommentActivity extends AppCompatActivity {
toolbar.setTitle(getString(R.string.comment_activity_label_is_replying)); toolbar.setTitle(getString(R.string.comment_activity_label_is_replying));
} }
Log.i("fullname", parentFullname);
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
} }

View File

@ -3,14 +3,15 @@ package ml.docilealligator.infinityforreddit;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import com.multilevelview.models.RecyclerViewItem; import java.util.ArrayList;
class CommentData extends RecyclerViewItem implements Parcelable { class CommentData implements Parcelable {
private String id; private String id;
private String fullName; private String fullName;
private String author; private String author;
private String commentTime; private String commentTime;
private String commentContent; private String commentContent;
private String parentId;
private int score; private int score;
private int voteType; private int voteType;
private boolean isSubmitter; private boolean isSubmitter;
@ -19,16 +20,217 @@ class CommentData extends RecyclerViewItem implements Parcelable {
private boolean collapsed; private boolean collapsed;
private boolean hasReply; private boolean hasReply;
private boolean scoreHidden; private boolean scoreHidden;
private boolean isExpanded;
private ArrayList<CommentData> children;
private ArrayList<String> moreChildrenIds;
CommentData(String id, String fullName, String author, String commentTime, String commentContent, CommentData(String id, String fullName, String author, String commentTime, String commentContent,
int score, boolean isSubmitter, String permalink, int depth, boolean collapsed, String parentId, int score, boolean isSubmitter, String permalink, int depth,
boolean hasReply, boolean scoreHidden) { boolean collapsed, boolean hasReply, boolean scoreHidden) {
this.id = id;
this.fullName = fullName;
this.author = author;
this.commentTime = commentTime;
this.commentContent = commentContent;
this.parentId = parentId;
this.score = score;
this.isSubmitter = isSubmitter;
this.permalink = RedditUtils.API_BASE_URI + permalink;
this.depth = depth;
this.collapsed = collapsed;
this.hasReply = hasReply;
this.scoreHidden = scoreHidden;
this.isExpanded = false;
}
protected CommentData(Parcel in) {
id = in.readString();
fullName = in.readString();
author = in.readString();
commentTime = in.readString();
commentContent = in.readString();
parentId = in.readString();
score = in.readInt();
voteType = in.readInt();
isSubmitter = in.readByte() != 0;
permalink = in.readString();
depth = in.readInt();
collapsed = in.readByte() != 0;
hasReply = in.readByte() != 0;
scoreHidden = in.readByte() != 0;
isExpanded = in.readByte() != 0;
in.readStringList(moreChildrenIds);
}
public static final Creator<CommentData> CREATOR = new Creator<CommentData>() {
@Override
public CommentData createFromParcel(Parcel in) {
return new CommentData(in);
}
@Override
public CommentData[] newArray(int size) {
return new CommentData[size];
}
};
public String getId() {
return id;
}
public String getFullName() {
return fullName;
}
public String getAuthor() {
return author;
}
public String getCommentTime() {
return commentTime;
}
public String getCommentContent() {
return commentContent;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public boolean isSubmitter() {
return isSubmitter;
}
public String getPermalink() {
return permalink;
}
public int getDepth() {
return depth;
}
public boolean isCollapsed() {
return collapsed;
}
public boolean hasReply() {
return hasReply;
}
public void setHasReply(boolean hasReply) {
this.hasReply = hasReply;
}
public boolean isScoreHidden() {
return scoreHidden;
}
public boolean isExpanded() {
return isExpanded;
}
public void setExpanded(boolean isExpanded) {
this.isExpanded = isExpanded;
}
public int getVoteType() {
return voteType;
}
public void setVoteType(int voteType) {
this.voteType = voteType;
}
public ArrayList<CommentData> getChildren() {
return children;
}
public void setChildren(ArrayList<CommentData> children) {
this.children = children;
}
public void addChildren(ArrayList<CommentData> moreChildren) {
if(children == null) {
setChildren(moreChildren);
} else {
children.addAll(moreChildren);
}
}
public ArrayList<String> getMoreChildrenIds() {
return moreChildrenIds;
}
public void setMoreChildrenIds(ArrayList<String> moreChildrenIds) {
this.moreChildrenIds = moreChildrenIds;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(id);
parcel.writeString(fullName);
parcel.writeString(author);
parcel.writeString(commentTime);
parcel.writeString(commentContent);
parcel.writeString(parentId);
parcel.writeInt(score);
parcel.writeInt(voteType);
parcel.writeByte((byte) (isSubmitter ? 1 : 0));
parcel.writeString(permalink);
parcel.writeInt(depth);
parcel.writeByte((byte) (collapsed ? 1 : 0));
parcel.writeByte((byte) (hasReply ? 1 : 0));
parcel.writeByte((byte) (scoreHidden ? 1 : 0));
parcel.writeByte((byte) (isExpanded ? 1 : 0));
parcel.writeStringList(moreChildrenIds);
}
}
/*class CommentData extends RecyclerViewItem implements Parcelable {
private String id;
private String fullName;
private String author;
private String commentTime;
private String commentContent;
private String parentId;
private int score;
private int voteType;
private boolean isSubmitter;
private String permalink;
private int depth;
private boolean collapsed;
private boolean hasReply;
private boolean scoreHidden;
private ArrayList<String> moreChildrenIds;
CommentData(String id, String fullName, String author, String commentTime, String commentContent,
String parentId, int score, boolean isSubmitter, String permalink, int depth,
boolean collapsed, boolean hasReply, boolean scoreHidden) {
super(depth); super(depth);
this.id = id; this.id = id;
this.fullName = fullName; this.fullName = fullName;
this.author = author; this.author = author;
this.commentTime = commentTime; this.commentTime = commentTime;
this.commentContent = commentContent; this.commentContent = commentContent;
this.parentId = parentId;
this.score = score; this.score = score;
this.isSubmitter = isSubmitter; this.isSubmitter = isSubmitter;
this.permalink = RedditUtils.API_BASE_URI + permalink; this.permalink = RedditUtils.API_BASE_URI + permalink;
@ -45,6 +247,7 @@ class CommentData extends RecyclerViewItem implements Parcelable {
author = in.readString(); author = in.readString();
commentTime = in.readString(); commentTime = in.readString();
commentContent = in.readString(); commentContent = in.readString();
parentId = in.readString();
score = in.readInt(); score = in.readInt();
voteType = in.readInt(); voteType = in.readInt();
isSubmitter = in.readByte() != 0; isSubmitter = in.readByte() != 0;
@ -53,6 +256,7 @@ class CommentData extends RecyclerViewItem implements Parcelable {
collapsed = in.readByte() != 0; collapsed = in.readByte() != 0;
hasReply = in.readByte() != 0; hasReply = in.readByte() != 0;
scoreHidden = in.readByte() != 0; scoreHidden = in.readByte() != 0;
in.readStringList(moreChildrenIds);
super.setLevel(depth); super.setLevel(depth);
} }
@ -88,6 +292,14 @@ class CommentData extends RecyclerViewItem implements Parcelable {
return commentContent; return commentContent;
} }
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public int getScore() { public int getScore() {
return score; return score;
} }
@ -132,6 +344,14 @@ class CommentData extends RecyclerViewItem implements Parcelable {
this.voteType = voteType; this.voteType = voteType;
} }
public ArrayList<String> getMoreChildrenIds() {
return moreChildrenIds;
}
public void setMoreChildrenIds(ArrayList<String> moreChildrenIds) {
this.moreChildrenIds = moreChildrenIds;
}
@Override @Override
public int describeContents() { public int describeContents() {
return 0; return 0;
@ -144,6 +364,7 @@ class CommentData extends RecyclerViewItem implements Parcelable {
parcel.writeString(author); parcel.writeString(author);
parcel.writeString(commentTime); parcel.writeString(commentTime);
parcel.writeString(commentContent); parcel.writeString(commentContent);
parcel.writeString(parentId);
parcel.writeInt(score); parcel.writeInt(score);
parcel.writeInt(voteType); parcel.writeInt(voteType);
parcel.writeByte((byte) (isSubmitter ? 1 : 0)); parcel.writeByte((byte) (isSubmitter ? 1 : 0));
@ -152,5 +373,6 @@ class CommentData extends RecyclerViewItem implements Parcelable {
parcel.writeByte((byte) (collapsed ? 1 : 0)); parcel.writeByte((byte) (collapsed ? 1 : 0));
parcel.writeByte((byte) (hasReply ? 1 : 0)); parcel.writeByte((byte) (hasReply ? 1 : 0));
parcel.writeByte((byte) (scoreHidden ? 1 : 0)); parcel.writeByte((byte) (scoreHidden ? 1 : 0));
parcel.writeStringList(moreChildrenIds);
} }
} }*/

View File

@ -5,6 +5,7 @@ import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.graphics.ColorFilter; import android.graphics.ColorFilter;
import android.net.Uri; import android.net.Uri;
import android.os.Handler;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -18,12 +19,7 @@ import androidx.browser.customtabs.CustomTabsIntent;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.multilevelview.MultiLevelAdapter;
import com.multilevelview.MultiLevelRecyclerView;
import com.multilevelview.models.RecyclerViewItem;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
import java.util.Locale; import java.util.Locale;
import butterknife.BindView; import butterknife.BindView;
@ -32,42 +28,59 @@ import retrofit2.Retrofit;
import ru.noties.markwon.SpannableConfiguration; import ru.noties.markwon.SpannableConfiguration;
import ru.noties.markwon.view.MarkwonView; import ru.noties.markwon.view.MarkwonView;
class CommentMultiLevelRecyclerViewAdapter extends MultiLevelAdapter { class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Activity mActivity; private Activity mActivity;
private Retrofit mRetrofit; private Retrofit mRetrofit;
private Retrofit mOauthRetrofit; private Retrofit mOauthRetrofit;
private SharedPreferences mSharedPreferences; private SharedPreferences mSharedPreferences;
private ArrayList<CommentData> mCommentData; private ArrayList<CommentData> mCommentData;
private MultiLevelRecyclerView mMultiLevelRecyclerView; private RecyclerView mRecyclerView;
private String subredditNamePrefixed; private String mSubredditNamePrefixed;
private String article; private String mArticle;
private Locale locale; private Locale mLocale;
CommentMultiLevelRecyclerViewAdapter(Activity activity, Retrofit retrofit, Retrofit oauthRetrofit, private ArrayList<CommentData> mVisibleComments;
CommentRecyclerViewAdapter(Activity activity, Retrofit retrofit, Retrofit oauthRetrofit,
SharedPreferences sharedPreferences, ArrayList<CommentData> commentData, SharedPreferences sharedPreferences, ArrayList<CommentData> commentData,
MultiLevelRecyclerView multiLevelRecyclerView, RecyclerView recyclerView,
String subredditNamePrefixed, String article, Locale locale) { String subredditNamePrefixed, String article, Locale locale) {
super(commentData);
mActivity = activity; mActivity = activity;
mRetrofit = retrofit; mRetrofit = retrofit;
mOauthRetrofit = oauthRetrofit; mOauthRetrofit = oauthRetrofit;
mSharedPreferences = sharedPreferences; mSharedPreferences = sharedPreferences;
mCommentData = commentData; mCommentData = commentData;
mMultiLevelRecyclerView = multiLevelRecyclerView; mRecyclerView = recyclerView;
this.subredditNamePrefixed = subredditNamePrefixed; mSubredditNamePrefixed = subredditNamePrefixed;
this.article = article; mArticle = article;
this.locale = locale; mLocale = locale;
mVisibleComments = new ArrayList<>();
new Handler().post(() -> {
makeChildrenVisible(commentData, mVisibleComments);
notifyDataSetChanged();
});
}
private void makeChildrenVisible(ArrayList<CommentData> comments, ArrayList<CommentData> visibleComments) {
for(CommentData c : comments) {
visibleComments.add(c);
if(c.hasReply()) {
c.setExpanded(true);
makeChildrenVisible(c.getChildren(), visibleComments);
}
}
} }
@NonNull @NonNull
@Override @Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new CommentViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_comment, parent, false)); return new CommentViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_comment, parent, false));
} }
@Override @Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) { public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
final CommentData commentItem = mCommentData.get(position); final CommentData commentItem = mVisibleComments.get(position);
String authorPrefixed = "u/" + commentItem.getAuthor(); String authorPrefixed = "u/" + commentItem.getAuthor();
((CommentViewHolder) holder).authorTextView.setText(authorPrefixed); ((CommentViewHolder) holder).authorTextView.setText(authorPrefixed);
@ -78,6 +91,7 @@ class CommentMultiLevelRecyclerViewAdapter extends MultiLevelAdapter {
}); });
((CommentViewHolder) holder).commentTimeTextView.setText(commentItem.getCommentTime()); ((CommentViewHolder) holder).commentTimeTextView.setText(commentItem.getCommentTime());
SpannableConfiguration spannableConfiguration = SpannableConfiguration.builder(mActivity).linkResolver((view, link) -> { SpannableConfiguration spannableConfiguration = SpannableConfiguration.builder(mActivity).linkResolver((view, link) -> {
if (link.startsWith("/u/") || link.startsWith("u/")) { if (link.startsWith("/u/") || link.startsWith("u/")) {
Intent intent = new Intent(mActivity, ViewUserDetailActivity.class); Intent intent = new Intent(mActivity, ViewUserDetailActivity.class);
@ -101,35 +115,49 @@ class CommentMultiLevelRecyclerViewAdapter extends MultiLevelAdapter {
((CommentViewHolder) holder).scoreTextView.setText(Integer.toString(commentItem.getScore())); ((CommentViewHolder) holder).scoreTextView.setText(Integer.toString(commentItem.getScore()));
((CommentViewHolder) holder).verticalBlock.getLayoutParams().width = commentItem.getDepth() * 16; ((CommentViewHolder) holder).verticalBlock.getLayoutParams().width = commentItem.getDepth() * 16;
if (commentItem.hasReply()) {
setExpandButton(((CommentViewHolder) holder).expandButton, commentItem.isExpanded());
}
((CommentViewHolder) holder).shareButton.setOnClickListener(new View.OnClickListener() { ((CommentViewHolder) holder).shareButton.setOnClickListener(view -> {
@Override Intent intent = new Intent(Intent.ACTION_SEND);
public void onClick(View view) { intent.setType("text/plain");
Intent intent = new Intent(Intent.ACTION_SEND); String extraText = commentItem.getPermalink();
intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, extraText);
String extraText = commentItem.getPermalink(); mActivity.startActivity(Intent.createChooser(intent, "Share"));
intent.putExtra(Intent.EXTRA_TEXT, extraText);
mActivity.startActivity(Intent.createChooser(intent, "Share"));
}
}); });
if (commentItem.hasReply()) {
if(commentItem.isExpanded()) {
((CommentViewHolder) holder).expandButton.setImageResource(R.drawable.ic_expand_less_black_20dp);
} else {
((CommentViewHolder) holder).expandButton.setImageResource(R.drawable.ic_expand_more_black_20dp);
}
((CommentViewHolder) holder).expandButton.setVisibility(View.VISIBLE);
}
((CommentViewHolder) holder).expandButton.setOnClickListener(view -> { ((CommentViewHolder) holder).expandButton.setOnClickListener(view -> {
if (commentItem.hasChildren() && commentItem.getChildren().size() > 0) { if(commentItem.isExpanded()) {
mMultiLevelRecyclerView.toggleItemsGroup(holder.getAdapterPosition()); collapseChildren(holder.getAdapterPosition());
setExpandButton(((CommentViewHolder) holder).expandButton, commentItem.isExpanded()); ((CommentViewHolder) holder).expandButton
.setImageResource(R.drawable.ic_expand_more_black_20dp);
} else {
expandChildren(holder.getAdapterPosition());
commentItem.setExpanded(true);
((CommentViewHolder) holder).expandButton
.setImageResource(R.drawable.ic_expand_less_black_20dp);
}
/*if (commentItem.hasReply() && commentItem.getChildren().size() > 0) {
collapseChildren(holder.getAdapterPosition());
((CommentViewHolder) holder).expandButton
.setImageResource(R.drawable.ic_expand_more_black_20dp);
} else { } else {
((CommentViewHolder) holder).loadMoreCommentsProgressBar.setVisibility(View.VISIBLE); ((CommentViewHolder) holder).loadMoreCommentsProgressBar.setVisibility(View.VISIBLE);
FetchComment.fetchAllComment(mRetrofit, subredditNamePrefixed, article, commentItem.getId(), FetchComment.fetchAllComment(mRetrofit, mSubredditNamePrefixed, article, commentItem.getId(),
locale, false, commentItem.getDepth(), new FetchComment.FetchAllCommentListener() { locale, false, commentItem.getDepth(), new FetchComment.FetchAllCommentListener() {
@Override @Override
public void onFetchAllCommentSuccess(List<?> commentData) { public void onFetchAllCommentSuccess(List<?> commentData) {
commentItem.addChildren((List<RecyclerViewItem>) commentData); commentItem.addChildren((ArrayList<CommentData>) commentData);
((CommentViewHolder) holder).loadMoreCommentsProgressBar ((CommentViewHolder) holder).loadMoreCommentsProgressBar
.setVisibility(View.GONE); .setVisibility(View.GONE);
mMultiLevelRecyclerView.toggleItemsGroup(holder.getAdapterPosition()); expandChildren(holder.getAdapterPosition());
((CommentViewHolder) holder).expandButton ((CommentViewHolder) holder).expandButton
.setImageResource(R.drawable.ic_expand_less_black_20dp); .setImageResource(R.drawable.ic_expand_less_black_20dp);
} }
@ -140,7 +168,7 @@ class CommentMultiLevelRecyclerViewAdapter extends MultiLevelAdapter {
.setVisibility(View.GONE); .setVisibility(View.GONE);
} }
}); });
} }*/
}); });
((CommentViewHolder) holder).replyButton.setOnClickListener(view -> { ((CommentViewHolder) holder).replyButton.setOnClickListener(view -> {
@ -149,6 +177,7 @@ class CommentMultiLevelRecyclerViewAdapter extends MultiLevelAdapter {
intent.putExtra(CommentActivity.EXTRA_COMMENT_PARENT_TEXT_KEY, commentItem.getCommentContent()); intent.putExtra(CommentActivity.EXTRA_COMMENT_PARENT_TEXT_KEY, commentItem.getCommentContent());
intent.putExtra(CommentActivity.EXTRA_PARENT_FULLNAME_KEY, commentItem.getFullName()); intent.putExtra(CommentActivity.EXTRA_PARENT_FULLNAME_KEY, commentItem.getFullName());
intent.putExtra(CommentActivity.EXTRA_IS_REPLYING_KEY, true); intent.putExtra(CommentActivity.EXTRA_IS_REPLYING_KEY, true);
intent.putExtra(CommentActivity.EXTRA_PARENT_POSITION_KEY, holder.getAdapterPosition());
mActivity.startActivityForResult(intent, CommentActivity.WRITE_COMMENT_REQUEST_CODE); mActivity.startActivityForResult(intent, CommentActivity.WRITE_COMMENT_REQUEST_CODE);
}); });
@ -264,6 +293,58 @@ class CommentMultiLevelRecyclerViewAdapter extends MultiLevelAdapter {
}); });
} }
private void expandChildren(int position) {
mVisibleComments.get(position).setExpanded(true);
ArrayList<CommentData> children = mVisibleComments.get(position).getChildren();
if(children != null && children.size() > 0) {
mVisibleComments.addAll(position + 1, children);
for(int i = position + 1; i <= position + children.size(); i++) {
mVisibleComments.get(i).setExpanded(false);
}
notifyItemRangeInserted(position + 1, children.size());
}
}
private void collapseChildren(int position) {
mVisibleComments.get(position).setExpanded(false);
int depth = mVisibleComments.get(position).getDepth();
int allChildrenSize = 0;
for(int i = position + 1; i < mVisibleComments.size(); i++) {
if(mVisibleComments.get(i).getDepth() > depth) {
allChildrenSize++;
} else {
break;
}
}
mVisibleComments.subList(position + 1, position + 1 + allChildrenSize).clear();
notifyItemRangeRemoved(position + 1, allChildrenSize);
}
void addComments(ArrayList<CommentData> comments) {
int sizeBefore = mVisibleComments.size();
mVisibleComments.addAll(comments);
notifyItemRangeInserted(sizeBefore, comments.size());
}
//Need proper implementation
void addComment(CommentData comment) {
mCommentData.add(0, comment);
notifyItemInserted(0);
}
//Need proper implementation
void addChildComment(CommentData comment, int parentPosition) {
ArrayList<CommentData> childComments = mCommentData.get(parentPosition).getChildren();
if(childComments == null) {
childComments = new ArrayList<>();
}
childComments.add(0, comment);
mCommentData.get(parentPosition).addChildren(childComments);
mCommentData.get(parentPosition).setHasReply(true);
notifyItemChanged(parentPosition);
}
@Override @Override
public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) { public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
if (holder instanceof CommentViewHolder) { if (holder instanceof CommentViewHolder) {
@ -272,33 +353,9 @@ class CommentMultiLevelRecyclerViewAdapter extends MultiLevelAdapter {
} }
} }
void addComments(ArrayList<CommentData> comments) { @Override
int sizeBefore = mCommentData.size(); public int getItemCount() {
mCommentData.addAll(comments); return mVisibleComments.size();
notifyItemRangeInserted(sizeBefore, mCommentData.size() - sizeBefore);
}
void addComment(CommentData comment) {
mCommentData.add(0, comment);
notifyItemInserted(0);
}
void addChildComment(CommentData comment, int parentPosition) {
List<RecyclerViewItem> childComments = mCommentData.get(parentPosition).getChildren();
if(childComments == null) {
childComments = new ArrayList<>();
}
childComments.add(0, comment);
mCommentData.get(parentPosition).addChildren(childComments);
mCommentData.get(parentPosition).setHasReply(true);
notifyItemChanged(parentPosition);
mMultiLevelRecyclerView.toggleItemsGroup(parentPosition);
}
private void setExpandButton(ImageView expandButton, boolean isExpanded) {
// set the icon based on the current state
expandButton.setVisibility(View.VISIBLE);
expandButton.setImageResource(isExpanded ? R.drawable.ic_expand_less_black_20dp : R.drawable.ic_expand_more_black_20dp);
} }
class CommentViewHolder extends RecyclerView.ViewHolder { class CommentViewHolder extends RecyclerView.ViewHolder {

View File

@ -5,7 +5,6 @@ import android.util.Log;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
import java.util.Locale; import java.util.Locale;
import retrofit2.Call; import retrofit2.Call;
@ -15,18 +14,18 @@ import retrofit2.Retrofit;
class FetchComment { class FetchComment {
interface FetchCommentListener { interface FetchCommentListener {
void onFetchCommentSuccess(List<?> commentsData, void onFetchCommentSuccess(ArrayList<CommentData> commentsData,
String parentId, ArrayList<String> children); String parentId, ArrayList<String> children);
void onFetchCommentFailed(); void onFetchCommentFailed();
} }
interface FetchMoreCommentListener { interface FetchMoreCommentListener {
void onFetchMoreCommentSuccess(List<?> commentsData, int childrenStartingIndex); void onFetchMoreCommentSuccess(ArrayList<CommentData> commentsData, int childrenStartingIndex);
void onFetchMoreCommentFailed(); void onFetchMoreCommentFailed();
} }
interface FetchAllCommentListener { interface FetchAllCommentListener {
void onFetchAllCommentSuccess(List<?> commentData); void onFetchAllCommentSuccess(ArrayList<CommentData> commentData);
void onFetchAllCommentFailed(); void onFetchAllCommentFailed();
} }
@ -43,10 +42,10 @@ class FetchComment {
locale, isPost, parentDepth, locale, isPost, parentDepth,
new ParseComment.ParseCommentListener() { new ParseComment.ParseCommentListener() {
@Override @Override
public void onParseCommentSuccess(List<?> commentData, public void onParseCommentSuccess(ArrayList<CommentData> commentData,
String parentId, ArrayList<String> children) { String parentId, ArrayList<String> moreChildrenIds) {
fetchCommentListener.onFetchCommentSuccess(commentData, parentId, fetchCommentListener.onFetchCommentSuccess(commentData, parentId,
children); moreChildrenIds);
} }
@Override @Override
@ -104,8 +103,8 @@ class FetchComment {
ParseComment.parseMoreComment(response.body(), new ArrayList<>(), locale, ParseComment.parseMoreComment(response.body(), new ArrayList<>(), locale,
0, new ParseComment.ParseCommentListener() { 0, new ParseComment.ParseCommentListener() {
@Override @Override
public void onParseCommentSuccess(List<?> commentData, String parentId, public void onParseCommentSuccess(ArrayList<CommentData> commentData, String parentId,
ArrayList<String> children) { ArrayList<String> moreChildrenIds) {
fetchMoreCommentListener.onFetchMoreCommentSuccess(commentData, startingIndex + 100); fetchMoreCommentListener.onFetchMoreCommentSuccess(commentData, startingIndex + 100);
} }
@ -155,12 +154,12 @@ class FetchComment {
fetchComment(retrofit, subredditNamePrefixed, article, comment, locale, isPost, parentDepth, fetchComment(retrofit, subredditNamePrefixed, article, comment, locale, isPost, parentDepth,
new FetchCommentListener() { new FetchCommentListener() {
@Override @Override
public void onFetchCommentSuccess(List<?> commentsData, String parentId, ArrayList<String> children) { public void onFetchCommentSuccess(ArrayList<CommentData> commentsData, String parentId, ArrayList<String> children) {
if(children.size() != 0) { if(children.size() != 0) {
fetchMoreComment(retrofit, subredditNamePrefixed, parentId, children, fetchMoreComment(retrofit, subredditNamePrefixed, parentId, children,
0, locale, new FetchMoreCommentListener() { 0, locale, new FetchMoreCommentListener() {
@Override @Override
public void onFetchMoreCommentSuccess(List<?> commentsData, public void onFetchMoreCommentSuccess(ArrayList<CommentData> commentsData,
int childrenStartingIndex) { int childrenStartingIndex) {
((ArrayList<CommentData>) commentsData).addAll((ArrayList<CommentData>) commentsData); ((ArrayList<CommentData>) commentsData).addAll((ArrayList<CommentData>) commentsData);
fetchAllCommentListener.onFetchAllCommentSuccess(commentsData); fetchAllCommentListener.onFetchAllCommentSuccess(commentsData);

View File

@ -3,6 +3,8 @@ package ml.docilealligator.infinityforreddit;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.util.Log; import android.util.Log;
import androidx.annotation.Nullable;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
@ -10,12 +12,11 @@ import org.json.JSONObject;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.List;
import java.util.Locale; import java.util.Locale;
class ParseComment { class ParseComment {
interface ParseCommentListener { interface ParseCommentListener {
void onParseCommentSuccess(List<?> commentData, String parentId, ArrayList<String> children); void onParseCommentSuccess(ArrayList<CommentData> commentData, String parentId, ArrayList<String> moreChildrenIds);
void onParseCommentFailed(); void onParseCommentFailed();
} }
@ -33,7 +34,8 @@ class ParseComment {
boolean isPost, int parentDepth, ParseCommentListener parseCommentListener) { boolean isPost, int parentDepth, ParseCommentListener parseCommentListener) {
try { try {
JSONArray childrenArray = new JSONArray(response); JSONArray childrenArray = new JSONArray(response);
String parentId = childrenArray.getJSONObject(0).getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY)
.getJSONObject(0).getJSONObject(JSONUtils.DATA_KEY).getString(JSONUtils.NAME_KEY);
if(isPost) { if(isPost) {
childrenArray = childrenArray.getJSONObject(1).getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY); childrenArray = childrenArray.getJSONObject(1).getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY);
} else { } else {
@ -41,7 +43,8 @@ class ParseComment {
.getJSONObject(0).getJSONObject(JSONUtils.DATA_KEY).getJSONObject(JSONUtils.REPLIES_KEY) .getJSONObject(0).getJSONObject(JSONUtils.DATA_KEY).getJSONObject(JSONUtils.REPLIES_KEY)
.getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY); .getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY);
} }
new ParseCommentAsyncTask(childrenArray, commentData, locale, parentDepth, parseCommentListener).execute();
new ParseCommentAsyncTask(childrenArray, commentData, locale, parentId, parentDepth, parseCommentListener).execute();
} catch (JSONException e) { } catch (JSONException e) {
e.printStackTrace(); e.printStackTrace();
if(e.getMessage() != null) { if(e.getMessage() != null) {
@ -59,7 +62,7 @@ class ParseComment {
int parentDepth, ParseCommentListener parseCommentListener) { int parentDepth, ParseCommentListener parseCommentListener) {
try { try {
JSONArray childrenArray = new JSONObject(response).getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY); JSONArray childrenArray = new JSONObject(response).getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY);
new ParseCommentAsyncTask(childrenArray, commentData, locale, parentDepth, parseCommentListener).execute(); new ParseCommentAsyncTask(childrenArray, commentData, locale, null, parentDepth, parseCommentListener).execute();
} catch (JSONException e) { } catch (JSONException e) {
e.printStackTrace(); e.printStackTrace();
if(e.getMessage() != null) { if(e.getMessage() != null) {
@ -78,20 +81,21 @@ class ParseComment {
private JSONArray comments; private JSONArray comments;
private ArrayList<CommentData> commentData; private ArrayList<CommentData> commentData;
private ArrayList<CommentData> newcommentData; private ArrayList<CommentData> newcommentData;
private ArrayList<String> children; private ArrayList<String> moreChildrenIds;
private Locale locale; private Locale locale;
private String parentId;
private int parentDepth; private int parentDepth;
private ParseCommentListener parseCommentListener; private ParseCommentListener parseCommentListener;
private boolean parseFailed; private boolean parseFailed;
private String parentId;
ParseCommentAsyncTask(JSONArray comments, ArrayList<CommentData> commentData, Locale locale, ParseCommentAsyncTask(JSONArray comments, ArrayList<CommentData> commentData, Locale locale,
int parentDepth, ParseCommentListener parseCommentListener){ @Nullable String parentId, int parentDepth, ParseCommentListener parseCommentListener){
this.comments = comments; this.comments = comments;
this.commentData = commentData; this.commentData = commentData;
newcommentData = new ArrayList<>(); newcommentData = new ArrayList<>();
children = new ArrayList<>(); moreChildrenIds = new ArrayList<>();
this.locale = locale; this.locale = locale;
this.parentId = parentId;
this.parentDepth = parentDepth; this.parentDepth = parentDepth;
parseFailed = false; parseFailed = false;
this.parseCommentListener = parseCommentListener; this.parseCommentListener = parseCommentListener;
@ -100,32 +104,7 @@ class ParseComment {
@Override @Override
protected Void doInBackground(Void... voids) { protected Void doInBackground(Void... voids) {
try { try {
int actualCommentLength; parseCommentRecursion(comments, newcommentData, moreChildrenIds, parentDepth, locale);
if(comments.length() == 0) {
return null;
}
JSONObject more = comments.getJSONObject(comments.length() - 1).getJSONObject(JSONUtils.DATA_KEY);
//Maybe children contain only comments and no more info
if(more.has(JSONUtils.COUNT_KEY)) {
JSONArray childrenArray = more.getJSONArray(JSONUtils.CHILDREN_KEY);
parentId = more.getString(JSONUtils.PARENT_ID_KEY);
for(int i = 0; i < childrenArray.length(); i++) {
children.add(childrenArray.getString(i));
}
actualCommentLength = comments.length() - 1;
} else {
actualCommentLength = comments.length();
}
for (int i = 0; i < actualCommentLength; i++) {
JSONObject data = comments.getJSONObject(i).getJSONObject(JSONUtils.DATA_KEY);
newcommentData.add(parseSingleComment(data, parentDepth, locale));
}
} catch (JSONException e) { } catch (JSONException e) {
parseFailed = true; parseFailed = true;
if(e.getMessage() != null) { if(e.getMessage() != null) {
@ -139,13 +118,55 @@ class ParseComment {
protected void onPostExecute(Void aVoid) { protected void onPostExecute(Void aVoid) {
if(!parseFailed) { if(!parseFailed) {
commentData.addAll(newcommentData); commentData.addAll(newcommentData);
parseCommentListener.onParseCommentSuccess(commentData, parentId, children); parseCommentListener.onParseCommentSuccess(commentData, parentId, moreChildrenIds);
} else { } else {
parseCommentListener.onParseCommentFailed(); parseCommentListener.onParseCommentFailed();
} }
} }
} }
private static void parseCommentRecursion(JSONArray comments, ArrayList<CommentData> newCommentData,
ArrayList<String> moreChildrenIds, int parentDepth, Locale locale) throws JSONException {
int actualCommentLength;
if(comments.length() == 0) {
return;
}
JSONObject more = comments.getJSONObject(comments.length() - 1).getJSONObject(JSONUtils.DATA_KEY);
//Maybe moreChildrenIds contain only comments and no more info
if(more.has(JSONUtils.COUNT_KEY)) {
JSONArray childrenArray = more.getJSONArray(JSONUtils.CHILDREN_KEY);
for(int i = 0; i < childrenArray.length(); i++) {
moreChildrenIds.add(childrenArray.getString(i));
}
actualCommentLength = comments.length() - 1;
} else {
actualCommentLength = comments.length();
}
for (int i = 0; i < actualCommentLength; i++) {
JSONObject data = comments.getJSONObject(i).getJSONObject(JSONUtils.DATA_KEY);
CommentData singleComment = parseSingleComment(data, parentDepth, locale);
if(data.get(JSONUtils.REPLIES_KEY) instanceof JSONObject) {
JSONArray childrenArray = data.getJSONObject(JSONUtils.REPLIES_KEY)
.getJSONObject(JSONUtils.DATA_KEY).getJSONArray(JSONUtils.CHILDREN_KEY);
ArrayList<CommentData> children = new ArrayList<>();
ArrayList<String> nextMoreChildrenIds = new ArrayList<>();
parseCommentRecursion(childrenArray, children, nextMoreChildrenIds, singleComment.getDepth(),
locale);
singleComment.addChildren(children);
singleComment.setMoreChildrenIds(nextMoreChildrenIds);
}
newCommentData.add(singleComment);
}
}
private static class ParseMoreCommentBasicInfoAsyncTask extends AsyncTask<Void, Void, Void> { private static class ParseMoreCommentBasicInfoAsyncTask extends AsyncTask<Void, Void, Void> {
private JSONArray children; private JSONArray children;
private StringBuilder commaSeparatedChildren; private StringBuilder commaSeparatedChildren;
@ -229,11 +250,11 @@ class ParseComment {
} }
} }
} }
private static CommentData parseSingleComment(JSONObject singleCommentData, int parentDepth, Locale locale) throws JSONException { private static CommentData parseSingleComment(JSONObject singleCommentData, int parentDepth, Locale locale) throws JSONException {
String id = singleCommentData.getString(JSONUtils.ID_KEY); String id = singleCommentData.getString(JSONUtils.ID_KEY);
String fullName = singleCommentData.getString(JSONUtils.NAME_KEY); String fullName = singleCommentData.getString(JSONUtils.NAME_KEY);
String author = singleCommentData.getString(JSONUtils.AUTHOR_KEY); String author = singleCommentData.getString(JSONUtils.AUTHOR_KEY);
String parentId = singleCommentData.getString(JSONUtils.PARENT_ID_KEY);
boolean isSubmitter = singleCommentData.getBoolean(JSONUtils.IS_SUBMITTER_KEY); boolean isSubmitter = singleCommentData.getBoolean(JSONUtils.IS_SUBMITTER_KEY);
String commentContent = ""; String commentContent = "";
if(!singleCommentData.isNull(JSONUtils.BODY_HTML_KEY)) { if(!singleCommentData.isNull(JSONUtils.BODY_HTML_KEY)) {
@ -251,14 +272,14 @@ class ParseComment {
int depth; int depth;
if(singleCommentData.has(JSONUtils.DEPTH_KEY)) { if(singleCommentData.has(JSONUtils.DEPTH_KEY)) {
depth = singleCommentData.getInt(JSONUtils.DEPTH_KEY) + parentDepth; depth = singleCommentData.getInt(JSONUtils.DEPTH_KEY);
} else { } else {
depth = parentDepth; depth = parentDepth;
} }
boolean collapsed = singleCommentData.getBoolean(JSONUtils.COLLAPSED_KEY); boolean collapsed = singleCommentData.getBoolean(JSONUtils.COLLAPSED_KEY);
boolean hasReply = !(singleCommentData.get(JSONUtils.REPLIES_KEY) instanceof String); boolean hasReply = !(singleCommentData.get(JSONUtils.REPLIES_KEY) instanceof String);
return new CommentData(id, fullName, author, formattedSubmitTime, commentContent, score, return new CommentData(id, fullName, author, formattedSubmitTime, commentContent, parentId, score,
isSubmitter, permalink, depth, collapsed, hasReply, scoreHidden); isSubmitter, permalink, depth, collapsed, hasReply, scoreHidden);
} }
} }

View File

@ -28,6 +28,7 @@ import androidx.core.content.ContextCompat;
import androidx.core.widget.NestedScrollView; import androidx.core.widget.NestedScrollView;
import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
import com.bumptech.glide.RequestBuilder; import com.bumptech.glide.RequestBuilder;
@ -41,14 +42,12 @@ import com.google.android.material.card.MaterialCardView;
import com.google.android.material.chip.Chip; import com.google.android.material.chip.Chip;
import com.google.android.material.snackbar.Snackbar; import com.google.android.material.snackbar.Snackbar;
import com.lsjwzh.widget.materialloadingprogressbar.CircleProgressBar; import com.lsjwzh.widget.materialloadingprogressbar.CircleProgressBar;
import com.multilevelview.MultiLevelRecyclerView;
import com.santalu.aspectratioimageview.AspectRatioImageView; import com.santalu.aspectratioimageview.AspectRatioImageView;
import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.Subscribe;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List;
import java.util.Locale; import java.util.Locale;
import javax.inject.Inject; import javax.inject.Inject;
@ -90,7 +89,7 @@ public class ViewPostDetailActivity extends AppCompatActivity {
private ArrayList<String> children; private ArrayList<String> children;
private int mChildrenStartingIndex = 0; private int mChildrenStartingIndex = 0;
private CommentMultiLevelRecyclerViewAdapter mAdapter; private CommentRecyclerViewAdapter mAdapter;
private LoadSubredditIconAsyncTask mLoadSubredditIconAsyncTask; private LoadSubredditIconAsyncTask mLoadSubredditIconAsyncTask;
@BindView(R.id.coordinator_layout_view_post_detail) CoordinatorLayout mCoordinatorLayout; @BindView(R.id.coordinator_layout_view_post_detail) CoordinatorLayout mCoordinatorLayout;
@ -120,7 +119,7 @@ public class ViewPostDetailActivity extends AppCompatActivity {
@BindView(R.id.share_button_view_post_detail) ImageView mShareButton; @BindView(R.id.share_button_view_post_detail) ImageView mShareButton;
@BindView(R.id.comment_progress_bar_view_post_detail) CircleProgressBar mCommentProgressbar; @BindView(R.id.comment_progress_bar_view_post_detail) CircleProgressBar mCommentProgressbar;
@BindView(R.id.comment_card_view_view_post_detail) MaterialCardView mCommentCardView; @BindView(R.id.comment_card_view_view_post_detail) MaterialCardView mCommentCardView;
@BindView(R.id.recycler_view_view_post_detail) MultiLevelRecyclerView mRecyclerView; @BindView(R.id.recycler_view_view_post_detail) RecyclerView mRecyclerView;
@BindView(R.id.no_comment_wrapper_linear_layout_view_post_detail) LinearLayout mNoCommentWrapperLinearLayout; @BindView(R.id.no_comment_wrapper_linear_layout_view_post_detail) LinearLayout mNoCommentWrapperLinearLayout;
@BindView(R.id.no_comment_image_view_view_post_detail) ImageView mNoCommentImageView; @BindView(R.id.no_comment_image_view_view_post_detail) ImageView mNoCommentImageView;
@ -504,23 +503,18 @@ public class ViewPostDetailActivity extends AppCompatActivity {
FetchComment.fetchComment(mRetrofit, mPost.getSubredditNamePrefixed(), mPost.getId(), FetchComment.fetchComment(mRetrofit, mPost.getSubredditNamePrefixed(), mPost.getId(),
null, mLocale, true, 0, new FetchComment.FetchCommentListener() { null, mLocale, true, 0, new FetchComment.FetchCommentListener() {
@Override @Override
public void onFetchCommentSuccess(List<?> commentsData, public void onFetchCommentSuccess(ArrayList<CommentData> commentsData,
String parentId, ArrayList<String> children) { String parentId, ArrayList<String> children) {
ViewPostDetailActivity.this.children = children; ViewPostDetailActivity.this.children = children;
mCommentProgressbar.setVisibility(View.GONE); mCommentProgressbar.setVisibility(View.GONE);
mCommentsData.addAll((ArrayList<CommentData>) commentsData); mCommentsData.addAll(commentsData);
if (mCommentsData.size() > 0) { if (mCommentsData.size() > 0) {
if(mAdapter == null) { if(mAdapter == null) {
mAdapter = new CommentMultiLevelRecyclerViewAdapter( mAdapter = new CommentRecyclerViewAdapter(ViewPostDetailActivity.this, mRetrofit,
ViewPostDetailActivity.this, mRetrofit, mOauthRetrofit, mOauthRetrofit, mSharedPreferences, commentsData, mRecyclerView,
mSharedPreferences, mCommentsData, mPost.getSubredditNamePrefixed(), mPost.getId(), mLocale);
mRecyclerView, mPost.getSubredditNamePrefixed(),
mPost.getId(), mLocale);
mRecyclerView.setAdapter(mAdapter); mRecyclerView.setAdapter(mAdapter);
mRecyclerView.removeItemClickListeners();
mRecyclerView.setToggleItemOnClick(false);
mRecyclerView.setAccordion(false);
mNestedScrollView.getViewTreeObserver().addOnScrollChangedListener(() -> { mNestedScrollView.getViewTreeObserver().addOnScrollChangedListener(() -> {
if(!isLoadingMoreChildren) { if(!isLoadingMoreChildren) {
@ -556,8 +550,8 @@ public class ViewPostDetailActivity extends AppCompatActivity {
FetchComment.fetchMoreComment(mRetrofit, mPost.getSubredditNamePrefixed(), mPost.getFullName(), FetchComment.fetchMoreComment(mRetrofit, mPost.getSubredditNamePrefixed(), mPost.getFullName(),
children, startingIndex, mLocale, new FetchComment.FetchMoreCommentListener() { children, startingIndex, mLocale, new FetchComment.FetchMoreCommentListener() {
@Override @Override
public void onFetchMoreCommentSuccess(List<?> commentsData, int childrenStartingIndex) { public void onFetchMoreCommentSuccess(ArrayList<CommentData> commentsData, int childrenStartingIndex) {
mAdapter.addComments((ArrayList<CommentData>) commentsData); mAdapter.addComments(commentsData);
mChildrenStartingIndex = childrenStartingIndex; mChildrenStartingIndex = childrenStartingIndex;
isLoadingMoreChildren = false; isLoadingMoreChildren = false;
} }
@ -678,7 +672,7 @@ public class ViewPostDetailActivity extends AppCompatActivity {
} }
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.action_refresh_view_post_detail_activity: case R.id.action_refresh_view_post_detail_activity:
refresh(); refresh();

View File

@ -319,7 +319,12 @@
android:textColor="@color/primaryTextColor" android:textColor="@color/primaryTextColor"
android:textSize="18sp" /> android:textSize="18sp" />
<com.multilevelview.MultiLevelRecyclerView <!--<com.multilevelview.MultiLevelRecyclerView
android:id="@+id/recycler_view_view_post_detail"
android:layout_width="match_parent"
android:layout_height="wrap_content" />-->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view_view_post_detail" android:id="@+id/recycler_view_view_post_detail"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />

View File

@ -107,6 +107,7 @@
android:layout_toStartOf="@id/share_button_item_post_comment" android:layout_toStartOf="@id/share_button_item_post_comment"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_marginEnd="16dp" android:layout_marginEnd="16dp"
android:src="@drawable/ic_expand_less_black_20dp"
android:tint="@android:color/tab_indicator_text" android:tint="@android:color/tab_indicator_text"
android:background="?actionBarItemBackground" android:background="?actionBarItemBackground"
android:clickable="true" android:clickable="true"