mirror of
https://codeberg.org/Bazsalanszky/Infinity-For-Lemmy.git
synced 2024-12-25 18:38:22 +01:00
Loading more comments in ViewPostDetailActivity is back. Display a progress bar when loading more comments. Display an error view when loading more comments failed.
This commit is contained in:
parent
cfe0b357df
commit
08bfa254bc
@ -10,6 +10,7 @@ import android.net.Uri;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.ProgressBar;
|
||||
@ -52,7 +53,9 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||
private static final int VIEW_TYPE_FIRST_LOADING_FAILED = 2;
|
||||
private static final int VIEW_TYPE_NO_COMMENT_PLACEHOLDER = 3;
|
||||
private static final int VIEW_TYPE_COMMENT = 4;
|
||||
private static final int VIEW_TYPE_LOAD_MORE_COMMENT = 5;
|
||||
private static final int VIEW_TYPE_LOAD_MORE_CHILD_COMMENTS = 5;
|
||||
private static final int VIEW_TYPE_IS_LOADING_MORE_COMMENTS = 6;
|
||||
private static final int VIEW_TYPE_LOAD_MORE_COMMENTS_FAILED = 7;
|
||||
|
||||
private Activity mActivity;
|
||||
private Retrofit mRetrofit;
|
||||
@ -63,19 +66,22 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||
private ArrayList<CommentData> mVisibleComments;
|
||||
private String mSubredditNamePrefixed;
|
||||
private Locale mLocale;
|
||||
private UpdatePostInPostFragmentCallback mUpdatePostInPostFragmentCallback;
|
||||
private CommentRecyclerViewAdapterCallback mCommentRecyclerViewAdapterCallback;
|
||||
private LoadSubredditIconAsyncTask mLoadSubredditIconAsyncTask;
|
||||
private boolean isInitiallyLoading;
|
||||
private boolean isInitiallyLoadingFailed;
|
||||
private boolean mHasMoreComments;
|
||||
private boolean loadMoreCommentsFailed;
|
||||
|
||||
interface UpdatePostInPostFragmentCallback {
|
||||
interface CommentRecyclerViewAdapterCallback {
|
||||
void updatePost(Post post);
|
||||
void retryFetchingMoreComments();
|
||||
}
|
||||
|
||||
CommentRecyclerViewAdapter(Activity activity, Retrofit retrofit, Retrofit oauthRetrofit, RequestManager glide,
|
||||
SharedPreferences sharedPreferences, Post post, String subredditNamePrefixed,
|
||||
Locale locale, LoadSubredditIconAsyncTask loadSubredditIconAsyncTask,
|
||||
UpdatePostInPostFragmentCallback updatePostInPostFragmentCallback) {
|
||||
CommentRecyclerViewAdapterCallback commentRecyclerViewAdapterCallback) {
|
||||
mActivity = activity;
|
||||
mRetrofit = retrofit;
|
||||
mOauthRetrofit = oauthRetrofit;
|
||||
@ -86,9 +92,11 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||
mSubredditNamePrefixed = subredditNamePrefixed;
|
||||
mLocale = locale;
|
||||
mLoadSubredditIconAsyncTask = loadSubredditIconAsyncTask;
|
||||
mUpdatePostInPostFragmentCallback = updatePostInPostFragmentCallback;
|
||||
mCommentRecyclerViewAdapterCallback = commentRecyclerViewAdapterCallback;
|
||||
isInitiallyLoading = true;
|
||||
isInitiallyLoadingFailed = false;
|
||||
mHasMoreComments = false;
|
||||
loadMoreCommentsFailed = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -109,29 +117,42 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||
}
|
||||
}
|
||||
|
||||
if(position == mVisibleComments.size() + 1) {
|
||||
if(mHasMoreComments) {
|
||||
return VIEW_TYPE_IS_LOADING_MORE_COMMENTS;
|
||||
} else {
|
||||
return VIEW_TYPE_LOAD_MORE_COMMENTS_FAILED;
|
||||
}
|
||||
}
|
||||
|
||||
CommentData comment = mVisibleComments.get(position - 1);
|
||||
if(!comment.isPlaceHolder()) {
|
||||
return VIEW_TYPE_COMMENT;
|
||||
} else {
|
||||
return VIEW_TYPE_LOAD_MORE_COMMENT;
|
||||
return VIEW_TYPE_LOAD_MORE_CHILD_COMMENTS;
|
||||
}
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
if(viewType == VIEW_TYPE_POST_DETAIL) {
|
||||
return new PostDetailViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_post_detail, parent, false));
|
||||
} else if(viewType == VIEW_TYPE_FIRST_LOADING) {
|
||||
return new LoadCommentsViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_load_comments, parent, false));
|
||||
} else if(viewType == VIEW_TYPE_FIRST_LOADING_FAILED) {
|
||||
return new LoadCommentsFailedViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_load_comments_failed_placeholder, parent, false));
|
||||
} else if(viewType == VIEW_TYPE_NO_COMMENT_PLACEHOLDER) {
|
||||
return new NoCommentViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_no_comment_placeholder, parent, false));
|
||||
} else if(viewType == VIEW_TYPE_COMMENT) {
|
||||
return new CommentViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_comment, parent, false));
|
||||
} else {
|
||||
return new LoadMoreCommentViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_load_more_comments_placeholder, parent, false));
|
||||
switch (viewType) {
|
||||
case VIEW_TYPE_POST_DETAIL:
|
||||
return new PostDetailViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_post_detail, parent, false));
|
||||
case VIEW_TYPE_FIRST_LOADING:
|
||||
return new LoadCommentsViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_load_comments, parent, false));
|
||||
case VIEW_TYPE_FIRST_LOADING_FAILED:
|
||||
return new LoadCommentsFailedViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_load_comments_failed_placeholder, parent, false));
|
||||
case VIEW_TYPE_NO_COMMENT_PLACEHOLDER:
|
||||
return new NoCommentViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_no_comment_placeholder, parent, false));
|
||||
case VIEW_TYPE_COMMENT:
|
||||
return new CommentViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_comment, parent, false));
|
||||
case VIEW_TYPE_LOAD_MORE_CHILD_COMMENTS:
|
||||
return new LoadMoreChildCommentsViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_load_more_comments_placeholder, parent, false));
|
||||
case VIEW_TYPE_IS_LOADING_MORE_COMMENTS:
|
||||
return new IsLoadingMoreCommentsViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_comment_footer_loading, parent, false));
|
||||
default:
|
||||
return new LoadMoreCommentsFailedViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_comment_footer_error, parent, false));
|
||||
}
|
||||
}
|
||||
|
||||
@ -372,21 +393,23 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||
.setColorFilter(ContextCompat.getColor(mActivity, R.color.minusButtonColor), android.graphics.PorterDuff.Mode.SRC_IN);
|
||||
break;
|
||||
}
|
||||
} else if(holder instanceof LoadMoreCommentViewHolder) {
|
||||
} else if(holder instanceof LoadMoreChildCommentsViewHolder) {
|
||||
CommentData placeholder;
|
||||
placeholder = mVisibleComments.get(holder.getAdapterPosition() - 1);
|
||||
|
||||
ViewGroup.LayoutParams params = ((LoadMoreCommentViewHolder) holder).verticalBlock.getLayoutParams();
|
||||
ViewGroup.LayoutParams params = ((LoadMoreChildCommentsViewHolder) holder).verticalBlock.getLayoutParams();
|
||||
params.width = placeholder.getDepth() * 16;
|
||||
((LoadMoreCommentViewHolder) holder).verticalBlock.setLayoutParams(params);
|
||||
((LoadMoreChildCommentsViewHolder) holder).verticalBlock.setLayoutParams(params);
|
||||
|
||||
if(placeholder.isLoadingMoreChildren()) {
|
||||
((LoadMoreCommentViewHolder) holder).placeholderTextView.setText(R.string.loading);
|
||||
((LoadMoreChildCommentsViewHolder) holder).placeholderTextView.setText(R.string.loading);
|
||||
} else if(placeholder.isLoadMoreChildrenFailed()) {
|
||||
((LoadMoreCommentViewHolder) holder).placeholderTextView.setText(R.string.comment_load_more_comments_failed);
|
||||
((LoadMoreChildCommentsViewHolder) holder).placeholderTextView.setText(R.string.comment_load_more_comments_failed);
|
||||
} else {
|
||||
((LoadMoreCommentViewHolder) holder).placeholderTextView.setText(R.string.comment_load_more_comments);
|
||||
((LoadMoreChildCommentsViewHolder) holder).placeholderTextView.setText(R.string.comment_load_more_comments);
|
||||
}
|
||||
} else if(holder instanceof LoadMoreCommentsFailedViewHolder) {
|
||||
((LoadMoreCommentsFailedViewHolder) holder).errorTextView.setText(R.string.post_load_comments_failed);
|
||||
}
|
||||
}
|
||||
|
||||
@ -488,7 +511,7 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||
notifyItemRangeRemoved(position + 2, allChildrenSize);
|
||||
}
|
||||
|
||||
void addComments(ArrayList<CommentData> comments) {
|
||||
void addComments(ArrayList<CommentData> comments, boolean hasMoreComments) {
|
||||
if(mVisibleComments.size() == 0) {
|
||||
isInitiallyLoading = false;
|
||||
isInitiallyLoadingFailed = false;
|
||||
@ -502,6 +525,15 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||
int sizeBefore = mVisibleComments.size();
|
||||
mVisibleComments.addAll(comments);
|
||||
notifyItemRangeInserted(sizeBefore + 1, comments.size());
|
||||
|
||||
if(mHasMoreComments != hasMoreComments) {
|
||||
if(hasMoreComments) {
|
||||
notifyItemInserted(mVisibleComments.size() + 1);
|
||||
} else {
|
||||
notifyItemRemoved(mVisibleComments.size() + 1);
|
||||
}
|
||||
}
|
||||
mHasMoreComments = hasMoreComments;
|
||||
}
|
||||
|
||||
void addComment(CommentData comment) {
|
||||
@ -567,10 +599,17 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||
notifyItemChanged(1);
|
||||
}
|
||||
|
||||
void loadMoreCommentsFailed() {
|
||||
loadMoreCommentsFailed = true;
|
||||
notifyItemChanged(mVisibleComments.size() + 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) {
|
||||
if (holder instanceof CommentViewHolder) {
|
||||
((CommentViewHolder) holder).expandButton.setVisibility(View.GONE);
|
||||
((CommentViewHolder) holder).upvoteButton.clearColorFilter();
|
||||
((CommentViewHolder) holder).downvoteButton.clearColorFilter();
|
||||
}
|
||||
}
|
||||
|
||||
@ -580,6 +619,10 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||
return 2;
|
||||
}
|
||||
|
||||
if(mHasMoreComments || loadMoreCommentsFailed) {
|
||||
return mVisibleComments.size() + 2;
|
||||
}
|
||||
|
||||
return mVisibleComments.size() + 1;
|
||||
}
|
||||
|
||||
@ -607,7 +650,7 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||
@BindView(R.id.minus_button_item_post_detail) ImageView mDownvoteButton;
|
||||
@BindView(R.id.share_button_item_post_detail) ImageView mShareButton;
|
||||
|
||||
public PostDetailViewHolder(@NonNull View itemView) {
|
||||
PostDetailViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
|
||||
@ -648,7 +691,7 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||
|
||||
mScoreTextView.setText(Integer.toString(mPost.getScore() + mPost.getVoteType()));
|
||||
|
||||
mUpdatePostInPostFragmentCallback.updatePost(mPost);
|
||||
mCommentRecyclerViewAdapterCallback.updatePost(mPost);
|
||||
|
||||
VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingWithoutPositionListener() {
|
||||
@Override
|
||||
@ -664,7 +707,7 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||
mDownvoteButton.clearColorFilter();
|
||||
mScoreTextView.setText(Integer.toString(mPost.getScore() + mPost.getVoteType()));
|
||||
|
||||
mUpdatePostInPostFragmentCallback.updatePost(mPost);
|
||||
mCommentRecyclerViewAdapterCallback.updatePost(mPost);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -675,7 +718,7 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||
mUpvoteButton.setColorFilter(previousUpvoteButtonColorFilter);
|
||||
mDownvoteButton.setColorFilter(previousDownvoteButtonColorFilter);
|
||||
|
||||
mUpdatePostInPostFragmentCallback.updatePost(mPost);
|
||||
mCommentRecyclerViewAdapterCallback.updatePost(mPost);
|
||||
}
|
||||
}, mPost.getFullName(), newVoteType);
|
||||
});
|
||||
@ -702,7 +745,7 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||
|
||||
mScoreTextView.setText(Integer.toString(mPost.getScore() + mPost.getVoteType()));
|
||||
|
||||
mUpdatePostInPostFragmentCallback.updatePost(mPost);
|
||||
mCommentRecyclerViewAdapterCallback.updatePost(mPost);
|
||||
|
||||
VoteThing.voteThing(mOauthRetrofit, mSharedPreferences, new VoteThing.VoteThingWithoutPositionListener() {
|
||||
@Override
|
||||
@ -718,7 +761,7 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||
mUpvoteButton.clearColorFilter();
|
||||
mScoreTextView.setText(Integer.toString(mPost.getScore() + mPost.getVoteType()));
|
||||
|
||||
mUpdatePostInPostFragmentCallback.updatePost(mPost);
|
||||
mCommentRecyclerViewAdapterCallback.updatePost(mPost);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -729,7 +772,7 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||
mUpvoteButton.setColorFilter(previousUpvoteButtonColorFilter);
|
||||
mDownvoteButton.setColorFilter(previousDownvoteButtonColorFilter);
|
||||
|
||||
mUpdatePostInPostFragmentCallback.updatePost(mPost);
|
||||
mCommentRecyclerViewAdapterCallback.updatePost(mPost);
|
||||
}
|
||||
}, mPost.getFullName(), newVoteType);
|
||||
});
|
||||
@ -869,11 +912,11 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||
}
|
||||
}
|
||||
|
||||
class LoadMoreCommentViewHolder extends RecyclerView.ViewHolder {
|
||||
class LoadMoreChildCommentsViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.vertical_block_item_load_more_comments) View verticalBlock;
|
||||
@BindView(R.id.placeholder_text_view_item_load_more_comments) TextView placeholderTextView;
|
||||
|
||||
LoadMoreCommentViewHolder(View itemView) {
|
||||
LoadMoreChildCommentsViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
|
||||
@ -1055,4 +1098,22 @@ class CommentRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
|
||||
super(itemView);
|
||||
}
|
||||
}
|
||||
|
||||
class IsLoadingMoreCommentsViewHolder extends RecyclerView.ViewHolder {
|
||||
IsLoadingMoreCommentsViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
}
|
||||
}
|
||||
|
||||
class LoadMoreCommentsFailedViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.error_text_view_item_comment_footer_error) TextView errorTextView;
|
||||
@BindView(R.id.retry_button_item_comment_footer_error) Button retryButton;
|
||||
|
||||
public LoadMoreCommentsFailedViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
|
||||
retryButton.setOnClickListener(view -> mCommentRecyclerViewAdapterCallback.retryFetchingMoreComments());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -608,9 +608,8 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
|
||||
}
|
||||
|
||||
class ErrorViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.relative_layout_footer_error_item) RelativeLayout relativeLayout;
|
||||
@BindView(R.id.error_text_view_footer_error_item) TextView errorTextView;
|
||||
@BindView(R.id.retry_button_footer_error_item) Button retryButton;
|
||||
@BindView(R.id.error_text_view_item_footer_error) TextView errorTextView;
|
||||
@BindView(R.id.retry_button_item_footer_error) Button retryButton;
|
||||
|
||||
ErrorViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
@ -621,8 +620,6 @@ class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView.ViewHo
|
||||
}
|
||||
|
||||
class LoadingViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.progress_bar_footer_progress_bar_item) ProgressBar progressBar;
|
||||
|
||||
LoadingViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
|
@ -8,22 +8,22 @@ import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.constraintlayout.widget.ConstraintLayout;
|
||||
import androidx.paging.PagedListAdapter;
|
||||
import androidx.recyclerview.widget.DiffUtil;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.RequestManager;
|
||||
import com.bumptech.glide.request.RequestOptions;
|
||||
|
||||
import SubredditDatabase.SubredditData;
|
||||
import SubscribedSubredditDatabase.SubscribedSubredditDao;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.constraintlayout.widget.ConstraintLayout;
|
||||
import androidx.paging.PagedListAdapter;
|
||||
import androidx.recyclerview.widget.DiffUtil;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
|
||||
@ -201,9 +201,8 @@ public class SubredditListingRecyclerViewAdapter extends PagedListAdapter<Subred
|
||||
}
|
||||
|
||||
class ErrorViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.relative_layout_footer_error_item) RelativeLayout relativeLayout;
|
||||
@BindView(R.id.error_text_view_footer_error_item) TextView errorTextView;
|
||||
@BindView(R.id.retry_button_footer_error_item) Button retryButton;
|
||||
@BindView(R.id.error_text_view_item_footer_error) TextView errorTextView;
|
||||
@BindView(R.id.retry_button_item_footer_error) Button retryButton;
|
||||
|
||||
ErrorViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
@ -214,8 +213,6 @@ public class SubredditListingRecyclerViewAdapter extends PagedListAdapter<Subred
|
||||
}
|
||||
|
||||
class LoadingViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.progress_bar_footer_progress_bar_item) ProgressBar progressBar;
|
||||
|
||||
LoadingViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
|
@ -8,22 +8,22 @@ import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.ProgressBar;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.constraintlayout.widget.ConstraintLayout;
|
||||
import androidx.paging.PagedListAdapter;
|
||||
import androidx.recyclerview.widget.DiffUtil;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
||||
import com.bumptech.glide.Glide;
|
||||
import com.bumptech.glide.RequestManager;
|
||||
import com.bumptech.glide.request.RequestOptions;
|
||||
|
||||
import SubscribedUserDatabase.SubscribedUserDao;
|
||||
import User.UserData;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.constraintlayout.widget.ConstraintLayout;
|
||||
import androidx.paging.PagedListAdapter;
|
||||
import androidx.recyclerview.widget.DiffUtil;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
import butterknife.BindView;
|
||||
import butterknife.ButterKnife;
|
||||
import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
|
||||
@ -201,9 +201,8 @@ public class UserListingRecyclerViewAdapter extends PagedListAdapter<UserData, R
|
||||
}
|
||||
|
||||
class ErrorViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.relative_layout_footer_error_item) RelativeLayout relativeLayout;
|
||||
@BindView(R.id.error_text_view_footer_error_item) TextView errorTextView;
|
||||
@BindView(R.id.retry_button_footer_error_item) Button retryButton;
|
||||
@BindView(R.id.error_text_view_item_footer_error) TextView errorTextView;
|
||||
@BindView(R.id.retry_button_item_footer_error) Button retryButton;
|
||||
|
||||
ErrorViewHolder(View itemView) {
|
||||
super(itemView);
|
||||
@ -214,8 +213,6 @@ public class UserListingRecyclerViewAdapter extends PagedListAdapter<UserData, R
|
||||
}
|
||||
|
||||
class LoadingViewHolder extends RecyclerView.ViewHolder {
|
||||
@BindView(R.id.progress_bar_footer_progress_bar_item) ProgressBar progressBar;
|
||||
|
||||
LoadingViewHolder(@NonNull View itemView) {
|
||||
super(itemView);
|
||||
ButterKnife.bind(this, itemView);
|
||||
|
@ -57,7 +57,9 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
||||
private boolean isRefreshing = false;
|
||||
private ArrayList<String> children;
|
||||
private int mChildrenStartingIndex = 0;
|
||||
private boolean loadMoreChildrenSuccess = true;
|
||||
|
||||
private LinearLayoutManager mLinearLayoutManager;
|
||||
private CommentRecyclerViewAdapter mAdapter;
|
||||
private LoadSubredditIconAsyncTask mLoadSubredditIconAsyncTask;
|
||||
|
||||
@ -91,8 +93,8 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
||||
mGlide = Glide.with(this);
|
||||
mLocale = getResources().getConfiguration().locale;
|
||||
|
||||
mRecyclerView.setNestedScrollingEnabled(false);
|
||||
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
|
||||
mLinearLayoutManager = new LinearLayoutManager(this);
|
||||
mRecyclerView.setLayoutManager(mLinearLayoutManager);
|
||||
|
||||
if(savedInstanceState == null) {
|
||||
orientation = getResources().getConfiguration().orientation;
|
||||
@ -105,7 +107,20 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
||||
mAdapter = new CommentRecyclerViewAdapter(ViewPostDetailActivity.this, mRetrofit,
|
||||
mOauthRetrofit, mGlide, mSharedPreferences, mPost,
|
||||
mPost.getSubredditNamePrefixed(), mLocale, mLoadSubredditIconAsyncTask,
|
||||
post -> EventBus.getDefault().post(new PostUpdateEventToPostList(mPost, postListPosition)));
|
||||
new CommentRecyclerViewAdapter.CommentRecyclerViewAdapterCallback() {
|
||||
@Override
|
||||
public void updatePost(Post post) {
|
||||
EventBus.getDefault().post(new PostUpdateEventToPostList(mPost, postListPosition));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void retryFetchingMoreComments() {
|
||||
isLoadingMoreChildren = false;
|
||||
loadMoreChildrenSuccess = true;
|
||||
|
||||
fetchMoreComments();
|
||||
}
|
||||
});
|
||||
mRecyclerView.setAdapter(mAdapter);
|
||||
|
||||
if(savedInstanceState != null) {
|
||||
@ -133,16 +148,26 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
||||
String parentId, ArrayList<String> children) {
|
||||
ViewPostDetailActivity.this.children = children;
|
||||
|
||||
mAdapter.addComments(expandedComments);
|
||||
mAdapter.addComments(expandedComments, children.size() != 0);
|
||||
|
||||
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
|
||||
@Override
|
||||
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
|
||||
super.onScrolled(recyclerView, dx, dy);
|
||||
if(children.size() > 0) {
|
||||
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
|
||||
@Override
|
||||
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
|
||||
super.onScrolled(recyclerView, dx, dy);
|
||||
|
||||
if(!isLoadingMoreChildren && loadMoreChildrenSuccess) {
|
||||
int visibleItemCount = mLinearLayoutManager.getChildCount();
|
||||
int totalItemCount = mLinearLayoutManager.getItemCount();
|
||||
int firstVisibleItemPosition = mLinearLayoutManager.findFirstVisibleItemPosition();
|
||||
|
||||
}
|
||||
});
|
||||
if ((visibleItemCount + firstVisibleItemPosition >= totalItemCount) && firstVisibleItemPosition >= 0) {
|
||||
fetchMoreComments();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/*mCommentProgressbar.setVisibility(View.GONE);
|
||||
|
||||
@ -154,7 +179,7 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
||||
int diff = view.getBottom() - (mNestedScrollView.getHeight() +
|
||||
mNestedScrollView.getScrollY());
|
||||
if(diff == 0) {
|
||||
fetchMoreComment(mChildrenStartingIndex);
|
||||
fetchMoreComments(mChildrenStartingIndex);
|
||||
}
|
||||
}
|
||||
});
|
||||
@ -162,7 +187,7 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
||||
|
||||
mAdapter = new CommentRecyclerViewAdapter(ViewPostDetailActivity.this, mRetrofit,
|
||||
mOauthRetrofit, mGlide, mSharedPreferences, mPost,
|
||||
mPost.getSubredditNamePrefixed(), mLocale, new CommentRecyclerViewAdapter.UpdatePostInPostFragmentCallback() {
|
||||
mPost.getSubredditNamePrefixed(), mLocale, new CommentRecyclerViewAdapter.CommentRecyclerViewAdapterCallback() {
|
||||
@Override
|
||||
public void updatePost(Post post) {
|
||||
EventBus.getDefault().post(new PostUpdateEventToPostList(mPost, postListPosition));
|
||||
@ -184,27 +209,27 @@ public class ViewPostDetailActivity extends AppCompatActivity {
|
||||
});
|
||||
}
|
||||
|
||||
private void fetchMoreComment(int startingIndex) {
|
||||
if(isLoadingMoreChildren) {
|
||||
void fetchMoreComments() {
|
||||
if(isLoadingMoreChildren || !loadMoreChildrenSuccess) {
|
||||
return;
|
||||
}
|
||||
|
||||
isLoadingMoreChildren = true;
|
||||
FetchComment.fetchMoreComment(mRetrofit, mPost.getSubredditNamePrefixed(), children, startingIndex,
|
||||
FetchComment.fetchMoreComment(mRetrofit, mPost.getSubredditNamePrefixed(), children, mChildrenStartingIndex,
|
||||
0, mLocale, new FetchComment.FetchMoreCommentListener() {
|
||||
@Override
|
||||
public void onFetchMoreCommentSuccess(ArrayList<CommentData> expandedComments, int childrenStartingIndex) {
|
||||
mAdapter.addComments(expandedComments);
|
||||
mAdapter.addComments(expandedComments, childrenStartingIndex < children.size());
|
||||
mChildrenStartingIndex = childrenStartingIndex;
|
||||
isLoadingMoreChildren = false;
|
||||
loadMoreChildrenSuccess = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onFetchMoreCommentFailed() {
|
||||
isLoadingMoreChildren = false;
|
||||
Snackbar snackbar = Snackbar.make(mCoordinatorLayout, R.string.post_load_more_comments_failed, Snackbar.LENGTH_INDEFINITE);
|
||||
snackbar.setAction(R.string.retry, view -> fetchMoreComment(startingIndex));
|
||||
snackbar.show();
|
||||
loadMoreChildrenSuccess = false;
|
||||
mAdapter.loadMoreCommentsFailed();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
25
app/src/main/res/layout/item_comment_footer_error.xml
Normal file
25
app/src/main/res/layout/item_comment_footer_error.xml
Normal file
@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/relative_layout_item_comment_footer_error"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_margin="16dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/error_text_view_item_comment_footer_error"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_toStartOf="@id/retry_button_item_comment_footer_error"
|
||||
android:textSize="18sp" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/retry_button_item_comment_footer_error"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentEnd="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:text="@string/retry" />
|
||||
|
||||
</RelativeLayout>
|
14
app/src/main/res/layout/item_comment_footer_loading.xml
Normal file
14
app/src/main/res/layout/item_comment_footer_loading.xml
Normal file
@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout
|
||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<ProgressBar
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="16dp"
|
||||
android:layout_marginBottom="16dp"
|
||||
android:layout_centerHorizontal="true" />
|
||||
|
||||
</RelativeLayout>
|
@ -1,6 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:id="@+id/relative_layout_footer_error_item"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="16dp"
|
||||
@ -9,16 +8,16 @@
|
||||
android:layout_marginBottom="16dp">
|
||||
|
||||
<TextView
|
||||
android:id="@+id/error_text_view_footer_error_item"
|
||||
android:id="@+id/error_text_view_item_footer_error"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentStart="true"
|
||||
android:layout_centerVertical="true"
|
||||
android:layout_toStartOf="@id/retry_button_footer_error_item"
|
||||
android:layout_toStartOf="@id/retry_button_item_footer_error"
|
||||
android:textSize="18sp" />
|
||||
|
||||
<Button
|
||||
android:id="@+id/retry_button_footer_error_item"
|
||||
android:id="@+id/retry_button_item_footer_error"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_alignParentEnd="true"
|
||||
|
@ -5,7 +5,6 @@
|
||||
android:layout_height="wrap_content">
|
||||
|
||||
<ProgressBar
|
||||
android:id="@+id/progress_bar_footer_progress_bar_item"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginTop="8dp"
|
||||
|
@ -28,7 +28,6 @@
|
||||
|
||||
<string name="load_posts_failed">Error loading posts</string>
|
||||
<string name="post_load_comments_failed">Error loading comments</string>
|
||||
<string name="post_load_more_comments_failed">Error loading more comments</string>
|
||||
<string name="retry">Retry</string>
|
||||
<string name="comments">Comments</string>
|
||||
<string name="no_comments_yet">No comments yet. Write a comment?</string>
|
||||
|
Loading…
Reference in New Issue
Block a user