检查 RecyclerView 是否可滚动
Check if RecyclerView is scrollable
如何检查 RecyclerView
是否可滚动,即可见区域 below/above 是否有项目
我的回收站视图中有一个下拉菜单,它通过使用 notifyItemRangeInserted()
和 notifyItemRangeRemoved()
来工作。每当发生这种情况时,我想检查 RecyclerView
是否可滚动,因为我必须相应地调整另一个视图,像报亭中的横幅一样
想法是检查最后一个完全可见的元素是否是列表中的最后一个元素。
private boolean isScrollable()
{
return mLinearLayoutManager.findLastCompletelyVisibleItemPosition() + 1 ==
mRecyclerViewAdapter.getItemCount();
}
好了:
public boolean isRecyclerScrollable() {
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
RecyclerView.Adapter adapter = recyclerView.getAdapter();
if (layoutManager == null || adapter == null) return false;
return layoutManager.findLastCompletelyVisibleItemPosition() < adapter.getItemCount() - 1;
}
boolean isScrollable() {
LinearLayoutManager layoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
int itemCount = mRecyclerView.getAdapter().getItemCount();
return !(itemCount == 0 ||
(layoutManager.findFirstCompletelyVisibleItemPosition() == 0 &&
layoutManager.findLastCompletelyVisibleItemPosition() == itemCount - 1));
}
我找到了一个简单的解决方案,无论您在列表中的位置如何:
public boolean isRecyclerScrollable(RecyclerView recyclerView) {
return recyclerView.computeHorizontalScrollRange() > recyclerView.getWidth() || recyclerView.computeVerticalScrollRange() > recyclerView.getHeight();
}
这个适合我。
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
boolean isRecylerScrollable = recyclerView.computeHorizontalScrollRange() > recyclerView.getWidth();
if(isRecylerScrollable){
//do something
}
});
}
怎么样
// 1 = down; -1 = up
recyclerView.canScrollVertically(-1)
如果要检查是否有可滚动space,无论哪个方向
cardList.canScrollVertically(1) || cardList.canScrollVertically(-1)
在 Kotlin 中你可以这样做:
fun isRecyclerScrollable(): Boolean {
val layoutManager = recyclerView.layoutManager as LinearLayoutManager
val adapter = recyclerView.adapter
return if (adapter == null) false else layoutManager.findLastCompletelyVisibleItemPosition() < adapter.itemCount - 1
}
我遇到了同样的问题,答案已经发布,尤其是 Fabios,使我走上了正确的道路。但是 scrollRange 不支持填充,因此如果您的 Recyclerview 有填充,也需要考虑它们。
我现在在 Kotlin 中使用以下扩展 属性 来确定视图是否在滚动。
/**
* computes whether the RecyclerView's content is larger than the view container, i.e. whether or not the user can scroll
* returns null if either layout manager or adapter is not yet set or an incompatible layout manager is used (Linear- & GridLayoutManager work)
*/
val RecyclerView.canScroll: Boolean?
get() {
// if there's no adapter set, we don't know yet whether or not the view is scrollable
if (adapter == null) return null
val manager = layoutManager as? LinearLayoutManager ?: return null
if (manager.orientation == RecyclerView.HORIZONTAL) {
return computeHorizontalScrollRange() + paddingLeft + paddingRight > width
}
return computeVerticalScrollRange() + paddingTop + paddingBottom > height
}
使用这种方法:
recyclerView.viewTreeObserver.addOnScrollChangedListener {
val canScrollUp = recyclerView.canScrollVertically(-1)
val canScrollDown = recyclerView.canScrollVertically(1)
}
- 首先创建一个布尔值来检查循环。
- 添加 onScrolled 监听器:
binding.rvInformation.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
if (!scrollChecked) { // <- check the 1 loop
scrollChecked = true
if (binding.rvInformation.canScrollVertically(1)) {
// Can scroll
} else {
// Can't scroll
}
}
}
})
如何检查 RecyclerView
是否可滚动,即可见区域 below/above 是否有项目
我的回收站视图中有一个下拉菜单,它通过使用 notifyItemRangeInserted()
和 notifyItemRangeRemoved()
来工作。每当发生这种情况时,我想检查 RecyclerView
是否可滚动,因为我必须相应地调整另一个视图,像报亭中的横幅一样
想法是检查最后一个完全可见的元素是否是列表中的最后一个元素。
private boolean isScrollable()
{
return mLinearLayoutManager.findLastCompletelyVisibleItemPosition() + 1 ==
mRecyclerViewAdapter.getItemCount();
}
好了:
public boolean isRecyclerScrollable() {
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
RecyclerView.Adapter adapter = recyclerView.getAdapter();
if (layoutManager == null || adapter == null) return false;
return layoutManager.findLastCompletelyVisibleItemPosition() < adapter.getItemCount() - 1;
}
boolean isScrollable() {
LinearLayoutManager layoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
int itemCount = mRecyclerView.getAdapter().getItemCount();
return !(itemCount == 0 ||
(layoutManager.findFirstCompletelyVisibleItemPosition() == 0 &&
layoutManager.findLastCompletelyVisibleItemPosition() == itemCount - 1));
}
我找到了一个简单的解决方案,无论您在列表中的位置如何:
public boolean isRecyclerScrollable(RecyclerView recyclerView) {
return recyclerView.computeHorizontalScrollRange() > recyclerView.getWidth() || recyclerView.computeVerticalScrollRange() > recyclerView.getHeight();
}
这个适合我。
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
boolean isRecylerScrollable = recyclerView.computeHorizontalScrollRange() > recyclerView.getWidth();
if(isRecylerScrollable){
//do something
}
});
}
怎么样
// 1 = down; -1 = up
recyclerView.canScrollVertically(-1)
如果要检查是否有可滚动space,无论哪个方向
cardList.canScrollVertically(1) || cardList.canScrollVertically(-1)
在 Kotlin 中你可以这样做:
fun isRecyclerScrollable(): Boolean {
val layoutManager = recyclerView.layoutManager as LinearLayoutManager
val adapter = recyclerView.adapter
return if (adapter == null) false else layoutManager.findLastCompletelyVisibleItemPosition() < adapter.itemCount - 1
}
我遇到了同样的问题,答案已经发布,尤其是 Fabios,使我走上了正确的道路。但是 scrollRange 不支持填充,因此如果您的 Recyclerview 有填充,也需要考虑它们。
我现在在 Kotlin 中使用以下扩展 属性 来确定视图是否在滚动。
/**
* computes whether the RecyclerView's content is larger than the view container, i.e. whether or not the user can scroll
* returns null if either layout manager or adapter is not yet set or an incompatible layout manager is used (Linear- & GridLayoutManager work)
*/
val RecyclerView.canScroll: Boolean?
get() {
// if there's no adapter set, we don't know yet whether or not the view is scrollable
if (adapter == null) return null
val manager = layoutManager as? LinearLayoutManager ?: return null
if (manager.orientation == RecyclerView.HORIZONTAL) {
return computeHorizontalScrollRange() + paddingLeft + paddingRight > width
}
return computeVerticalScrollRange() + paddingTop + paddingBottom > height
}
使用这种方法:
recyclerView.viewTreeObserver.addOnScrollChangedListener {
val canScrollUp = recyclerView.canScrollVertically(-1)
val canScrollDown = recyclerView.canScrollVertically(1)
}
- 首先创建一个布尔值来检查循环。
- 添加 onScrolled 监听器:
binding.rvInformation.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
if (!scrollChecked) { // <- check the 1 loop
scrollChecked = true
if (binding.rvInformation.canScrollVertically(1)) {
// Can scroll
} else {
// Can't scroll
}
}
}
})