我在一个Scrollview中有2个水平和1个垂直(网格布局)。
<ScrollView>
<Horizontal RecyclerView/>
<Horizontal RecyclerView/>
<Vertical RecyclerView/>
</ScrollView>
以上是我的观点示意图。
我必须在垂直recyclerviews最后一项可见时加载数据,但我无法获得垂直视图的滚动事件。
这是我的scrollviewlistener。
recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
totalItemCount = gridLayoutManager.getItemCount();
lastVisibleItem = gridLayoutManager.findLastVisibleItemPosition();
if (!loading && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
// End has been reached
// Do something
if(onLoadMoreListener!=null) {
onLoadMoreListener.onLoadMore(lastVisibleItem);
}
loading = true;
}
}
});
但是这个setonscrollListener永远不会被触发。如何获得上述案例的滚动事件。
提前致谢:)
答案 0 :(得分:5)
我遇到的问题是如何解决它:
首先为滚动侦听器创建一个接口
edgeIndices
通过扩展ScrollView
创建自定义ScrollViewpublic interface EndlessScrollListener {
void onScrollChanged(EndlessScrollView scrollView,int x, int y, int oldx, int oldy);
}
然后在您的片段/活动布局中使用EndlessScrollView而不是默认值:
public class EndlessScrollView extends ScrollView
{
private EndlessScrollListener endlessScrollListener = null;
public EndlessScrollView(Context context) {
super(context);
}
public EndlessScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public EndlessScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setScrollViewListener(EndlessScrollListener endlessScrollListener) {
this.endlessScrollListener = endlessScrollListener;
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (endlessScrollListener != null) {
endlessScrollListener.onScrollChanged(this, l, t, oldl, oldt);
}
}
}
接下来,您的活动/片段应实现您在步骤1中创建的界面。
将您的Activity / Fragment设置为Scroll Listener,然后像这样使用:
<YOUR_PACKAGE_NAME.EndlessScrollView
android:id="@+id/my_scroll_view">
<!-- your recycler views ... -->
</YOUR_PACKAGE_NAME.EndlessScrollView>
答案 1 :(得分:2)
使用手势检测器在RecyclerView中获取滚动事件。
<强> 修改 强> 用NestedScrollView替换ScrollView解决了我的recyclelerview滚动问题。
final NestedScrollView parentScrollView=(NestedScrollView)view.findViewById (R.id.parentScrollView);
parentScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
@Override
public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
// Log.d("ScrollView","scrollX_"+scrollX+"_scrollY_"+scrollY+"_oldScrollX_"+oldScrollX+"_oldScrollY_"+oldScrollY);
//Do something
}
}
});
答案 2 :(得分:0)
当你在彼此内部使用拖动滚动元素时,你处于热水中!您应该计算Recycler项目的高度,然后找到整个回收者的高度。看下面的链接,我完全解释了这个问题。
Use RecyclerView indie ScrollView with flexible recycler item height
我希望它可以帮到你