在应用开发中,经常遇到Recyclerview中的子item中和Recyclerview的滚动事件冲突,例如在在Recyclerview中包含一个Mapview,这时候我们操作Mapview的时候肯定是不希望Recyclerview一起滚动的,那么我们就需要禁止Recyclerview的滚动了。下面直接上代码。
我们需要实现的就是重写一个LayoutManager了,其中在该方法中控制能否滑动的核心方法就是
canScrollVertically()【控制上下滑动】和 canScrollHorizontally()【控制左右滑动】两个方法了
import android.content.Context;
import android.support.v7.widget.LinearLayoutManager;
public class ScrollLinearLayoutManager extends LinearLayoutManager {
private boolean mCanVerticalScroll = true;
public ScrollLinearLayoutManager(Context context) {
super(context);
}
@Override
public boolean canScrollVertically() {
if (!mCanVerticalScroll){
return false;
}else {
return super.canScrollVertically();
}
}
public void setmCanVerticalScroll(boolean b){
mCanVerticalScroll = b;
}
}
这代码中我只需要控制列表上下滑动,所以只重写了canScrollVertically()方法,可以看到canScrollVertically()返回的值是mCanVerticalScroll这个布尔变量,于是乎setmCanVerticalScroll()这个方法就是我们控制列表能否滑动的关键方法了
下面是在代码中的使用,我的需求是用户按下某个item时候,你的上下滑动动作不生效。
贴代码:
/**监听item的触碰事件*/
@Override
public void onItemTouchClick(View v, int position, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {//如果是按下的话
mLayoutManager.setmCanVerticalScroll(false);//设置Recyclerview无法滚动
mDecorView.addView(mDetailsView);//弹出提示框
setDetails(mAdapter.getListItem(position));//加载提示框数据
} else if (event.getAction() == MotionEvent.ACTION_UP) {//如果是抬起的话
mDecorView.removeView(mDetailsView);//移除弹出提示框
mLayoutManager.setmCanVerticalScroll(true);//设置Recyclerview可以滚动
clearDetails();//清楚提示框的内容
}
}
ScrollLinearLayoutManager的话就和正常的layoutManger一样用就行了
mLayoutManager = new ScrollLinearLayoutManager(mContext);
mSalesReturnRecyList.getRecyclerView().setLayoutManager(mLayoutManager);
OK这个功能实现了