Sar*_*ius 73 android android-recyclerview
目前我正在使用以下代码来检查是否应启用SwipeRefreshLayout.
private void laySwipeToggle() {
if (mRecyclerView.getChildCount() == 0 || mRecyclerView.getChildAt(0).getTop() == 0) {
mLaySwipe.setEnabled(true);
} else {
mLaySwipe.setEnabled(false);
}
}
Run Code Online (Sandbox Code Playgroud)
但这是问题所在.当它滚动到另一个项目的视图时,边界mRecyclerView.getChildAt(0).getTop()也会返回0.

有什么像RecyclerView.isScrolledToBottom()或RecyclerView.isScrolledToTop()?
编辑:(mRecyclerView.getChildAt(0).getTop() == 0 && linearLayoutManager.findFirstVisibleItemPosition() == 0)有点做RecyclerView.isScrolledToTop(),但是怎么样RecyclerView.isScrolledToBottom()?
hum*_*kie 102
解决方案在布局管理器中.
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
// Add this to your Recycler view
recyclerView.setLayoutManager(layoutManager);
// To check if at the top of recycler view
if(layoutManager.firstCompletelyVisibleItemPosition()==0){
// Its at top
}
// To check if at the bottom of recycler view
if(layoutManager.lastCompletelyVisibleItemPosition()==data.size()-1){
// Its at bottom
}
Run Code Online (Sandbox Code Playgroud)
编辑
如果您的项目大小大于屏幕,请使用以下内容检测顶级事件.
RecyclerView recyclerView = (RecyclerView) view;
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
int pos = linearLayoutManager.findFirstVisibleItemPosition();
if(linearLayoutManager.findViewByPosition(pos).getTop()==0 && pos==0){
return true;
}
Run Code Online (Sandbox Code Playgroud)
PS:实际上,如果你RecyclerView直接把它放在里面,SwipeRefreshview你就不需要这样做了
Pen*_*zzz 64
recyclerView.canScrollVertically(int direction)如果您只是需要知道是否可以滚动,您可以尝试
She*_*lji 32
为了检查是否RecyclerView滚动到底部.使用以下代码.
/**
* Check whether the last item in RecyclerView is being displayed or not
*
* @param recyclerView which you would like to check
* @return true if last position was Visible and false Otherwise
*/
private boolean isLastItemDisplaying(RecyclerView recyclerView) {
if (recyclerView.getAdapter().getItemCount() != 0) {
int lastVisibleItemPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition();
if (lastVisibleItemPosition != RecyclerView.NO_POSITION && lastVisibleItemPosition == recyclerView.getAdapter().getItemCount() - 1)
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
一些额外的信息
如果你想实现ScrollToBottom的RecyclerView时候Edittext是tapped那么我建议你加1秒的延迟是这样的:
edittext.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP)
if (isLastItemDisplaying(recyclerView)) {
// The scrolling can happen instantly before keyboard even opens up so to handle that we add 1 second delay to scrolling
recyclerView.postDelayed(new Runnable() {
@Override
public void run() {
recyclerView.smoothScrollToPosition(recyclerView.getAdapter().getItemCount() - 1);
}
}, 1000);
}
return false;
}
});
Run Code Online (Sandbox Code Playgroud)
Tej*_*oid 20
@Saren Arterius,使用RecycleView的addOnScrollListener,您可以找到Vertical RecycleView的滚动顶部或底部,如下所示,
RecyclerView rv = (RecyclerView)findViewById(R.id.rv);
rv.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
if (dy < 0) {
// Recycle view scrolling up...
} else if (dy > 0) {
// Recycle view scrolling down...
}
}
});
Run Code Online (Sandbox Code Playgroud)
您可以使用以下命令检测 top
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if(isRecyclerViewAtTop())
{
//your recycler view reached Top do some thing
}
}
});
private boolean isRecyclerViewAtTop() {
if(recyclerView.getChildCount() == 0)
return true;
return recyclerView.getChildAt(0).getTop() == 0;
}
Run Code Online (Sandbox Code Playgroud)
当您到达顶部后释放手指时,这将检测顶部,如果您想在 reacyclerview 到达顶部后立即检测,请检查if(isRecyclerViewAtTop())内部onScrolled 方法
使用recyclerView.canScrollVertically(int方向)检查滚动的顶部还是底部。
方向= 1向下滚动(底部)
方向= -1向上滚动(顶部)
如果方法返回false,则意味着您到达顶部还是底部取决于方向。
只需保持对layoutManager的引用,并在Recycler视图上设置onScrollListener,就像这样
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
visibleItemCount = mRecyclerView.getChildCount();
totalItemCount = mLayoutManager.getItemCount();
firstVisibleItemIndex = mLayoutManager.findFirstVisibleItemPosition();
//synchronizew loading state when item count changes
if (loading) {
if (totalItemCount > previousTotal) {
loading = false;
previousTotal = totalItemCount;
}
}
if (!loading)
if ((totalItemCount - visibleItemCount) <= firstVisibleItemIndex) {
// Loading NOT in progress and end of list has been reached
// also triggered if not enough items to fill the screen
// if you start loading
loading = true;
} else if (firstVisibleItemIndex == 0){
// top of list reached
// if you start loading
loading = true;
}
}
}
});
Run Code Online (Sandbox Code Playgroud)