Arc*_*cos 9 android android-fragments android-viewpager android-recyclerview
我有一个viewpager,在其中一个片段中,我有两个独立的片段,分别包含一个垂直和水平的Recyclerview.
当我将水平回收视图滚动到最后一项并尝试进一步滑动时,viewpager会滚动到下一页.我不希望这种情况发生.当我尝试过度滚动水平回收视图时,我想禁用viewpager的分页.
但是,当我在其他地方滑动时,我不想禁用viewpager的分页.例如,如果我要在垂直的recyclelerview或父片段中的任何空白区域上滑动,它仍然会导致viewpager更改页面.
我在这个问题中读到了如何禁用viewpager的分页.同时这太问题是,有一个孩子viewpager类似,但是我还没有成功尝试复制与水平recyclerview.
这是一些结构:
自定义viewpager允许我禁用分页(从上面的第一个SO链接获取):
public class CustomViewPager extends ViewPager {
private boolean enabled;
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
this.enabled = true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (this.enabled) {
return super.onTouchEvent(event);
}
return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
if (this.enabled) {
return super.onInterceptTouchEvent(event);
}
return false;
}
public void setPagingEnabled(boolean enabled) {
this.enabled = enabled;
} }
Run Code Online (Sandbox Code Playgroud)
对于水平回收视图,我设置了一个ontouchlistener(类似于上面的第二个SO链接):
horizontalRecyclerView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()){
case MotionEvent.ACTION_MOVE:
customViewPager.setPagingEnabled(false);
break;
case MotionEvent.ACTION_UP:
customViewPager.setPagingEnabled(true);
break;
}
return false;
}
});
Run Code Online (Sandbox Code Playgroud)
额外的观察:我注意到有时如果我在滑动之前长按水平回收视图,它将不会进入viewpager的下一页.但是,如果我快速滑动,viewpager将转到下一页.
有谁知道这样做的正确方法?
任何帮助表示赞赏.
Sha*_*got 22
这是解决方案.
requestDisallowInterceptTouchEvent()
Run Code Online (Sandbox Code Playgroud)
此方法不允许父移动.它停止了viewpager触摸事件.
horizontalRecyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
int action = e.getAction();
switch (action) {
case MotionEvent.ACTION_MOVE:
rv.getParent().requestDisallowInterceptTouchEvent(true);
break;
}
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4762 次 |
| 最近记录: |