在正常的recyclerview中,最新的项目都在顶部,如果您将项目添加到recyclerview中,它会将现有项目向下推,新项目将位于顶部位置。
在reverseLayout recyclerview中,最新的项目都在底部,如果您将项目添加到recyclerview,则会在底部添加。这种布局对于评论提要非常有用,您希望最新评论位于底部。
例如,当您评论朋友的状态时,Facebook评论供稿就是一个很好的例子。您可以看到评论都有时间在底部发布,时间从上到下从12小时减少到10小时:
reverseLayout非常容易设置,我使用此代码完成了它:
mLayoutManager = new LinearLayoutManager(this);
mLayoutManager.setReverseLayout(true);
mLayoutManager.setStackFromEnd(true);
然而,我正在努力附加反向无限滚动监听器。我正在使用我的问题中的以下Vilen代码(Adding items to Endless Scroll RecyclerView with ProgressBar at bottom)并对其进行修改,以便onLoadMoreListener仅在向上滚动而不是向下时激活自身。您想要向上滚动到较早的评论:
if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
//if you add on addOnScrollListener, it will cause the scroll listener to be called twice each time you reset your adapter
recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
int firstVisibleItem;
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
final int currentFirstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition();
totalItemCount = linearLayoutManager.getItemCount();
lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
if(lastVisibleItem > firstVisibleItem)
{
Log.i("SCROLLING UP","TRUE");
if (!loading && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
current_page++;
if (onLoadMoreListener != null) {
onLoadMoreListener.onLoadMore(current_page);
}
loading = true;
}
}
lastVisibleItem=firstVisibleItem;
}
});
}
当调用onLoadMoreListener时,在我的活动类中调用以下代码:
CommentsAdapter.OnLoadMoreListener onLoadMoreListener = new CommentsAdapter.OnLoadMoreListener() {
@Override
public void onLoadMore(int current_page) {
//get the firstCommentId on the list of comments so that we can send it to the server to fetch comments less than that comment id to display in our recyclerview
firstCommentId = comments.get(0).getId();
//add empty item for progress bar / wheel and display the progress bar / wheel
Comment comment = new Comment();
comment.setViewType(Constants.COMMENT_PROGRESS_BAR);
comments.add(0, comment);
mCommentAdapter.notifyItemInserted(0);
mCommentAdapter.notifyItemRangeChanged(1, comments.size());
//CODE FOR NETWORK OPERATIONS GOES HERE TO FETCH THE NEXT FEW COMMENTS WHEN SCROLLING UP//
}
};
但是,当我向上滚动时,似乎根本没有调用onLoadMoreListener。
我还确保我的Feed中至少有10条评论,之前已加载5条,当我向上滚动时应加载5条评论。
对于这个反向的OnLoadMoreListener,我有什么问题吗?
修改
reverseLayout recyclerview实际上可以使用Vilen的原始代码,我上传了一个github repo来显示:
https://github.com/Winghin2517/ReverseLayoutRecyclerview
当onLoadMoreListener被激活时仍然存在问题 - 如果评论列表只包含3条评论并且没有其他评论要添加,我不希望onLoadMoreListener在我最初查看我的评论 - 当我第一次点击我的应用以查看评论。现在,当我点击查看我的评论时,即使数据集中有3个评论,仍然会显示progressBar,并且在2秒后消失,我认为没有必要(请参阅github repo,我在此演示)。
当只有3个注释时禁用它也不是一个好主意,因为onLoadMoreListener就像swipeToRefresh对象一样。如果用户在查看评论供稿后有更多评论,他可以向下滑动,onLoadMoreListener将显示这些评论。
当Feed最初加载 时,有没有办法禁用它?
答案 0 :(得分:11)
Simon:我之前提出的解决方案here可以正常使用反向布局而无需任何修改。我为反向布局添加的唯一内容是在第一次显示时自动滚动到第一个项目,但这取决于您。 现在回过头来发帖了。你提到滚动时没有任何事情发生。所以我的猜测是你以错误的顺序初始化你的recylcer视图。确保你这样做
mLayoutManager = new LinearLayoutManager(this);
mLayoutManager.setReverseLayout(true);
mLayoutManager.setStackFromEnd(true);
mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter = new MyAdapter<>(myDataset, mRecyclerView);
mRecyclerView.setAdapter(mAdapter);
注意首先实例化布局管理器,然后设置它,然后提供适配器。如果是这样,请告诉我。
修改只需在下面的评论中提及:
忘记我们对
onLoadMoreListener
所做的事情以及所有滚动内容只需使用RecyclerView
中包含的标准SwipeToRefreshLayout
答案 1 :(得分:0)
我真的不想在最后使用SwipeToRefreshLayout,因为当你有评论Feed时它看起来不太好。
所以我所做的是修改onLoadMoreListener方法,以便它检测何时首次启动活动。如果它是第一次启动,我们不希望显示进度条:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
initial = true;
}
}
然后我们将使用初始布尔变量来确定活动是否刚刚启动并禁用进度条。
@Override
public void onLoadMore(int current_page) {
//add progress item
if (initial) {
//we do not add the progress bar when the activity opens initially so
//we do nothing. We just change the variable to false so going forward, you will add a progress bar each time you refresh
initial = false;
} else {
comments.add(createProgressBar());
mCommentAdapter.notifyItemInserted(comments.size()-1);
}