在應用開發中,經常遇到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這個功能實現了