場(chǎng)景再現(xiàn)

GIF.gif
布局分析

無標(biāo)題.png
外層是一個(gè)RecyclerView,每個(gè)Item中又有一個(gè)可以上下滑動(dòng)的RecyclerView,這種設(shè)計(jì)內(nèi)外層肯定會(huì)造成滑動(dòng)沖突,編碼完成的時(shí)候表現(xiàn)就是,內(nèi)部的 RecyclerView是無法滑動(dòng)的,就目前的問題嘗試著處理一下。
解決方法具體步驟如下:
- 步驟一:利用紅色Recycleview的addOnItemTouchListener 函數(shù)監(jiān)聽touchEvent獲取event坐標(biāo)點(diǎn),給ViewHolder判斷是否請(qǐng)求不攔截
紅色.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(RecyclerView rv,MotionEvent e) {
//處理RecyclerView的item中嵌套R(shí)ecyclerView的滑動(dòng)沖突解決
View childViewUnder = 紅色.findChildViewUnder(e.getX(), e.getY());
if (rv != null && childViewUnder != null){
BaseViewHolder baseViewHolder = (BaseViewHolder)rv.getChildViewHolder(childViewUnder);
紅色.requestDisallowInterceptTouchEvent(Utils.isTouchValue(baseViewHolder.getView(R.id.藍(lán)色),e.getRawX(),e.getRawY()));
}
return false;
}
@Override
public void onTouchEvent(RecyclerView rv,MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
});
- 步驟二:在工具類的Utils中的isTouchValue函數(shù),判斷event坐標(biāo)點(diǎn)是否在藍(lán)色Recycleview范圍內(nèi)
/**
*
* @param x event的rowX
* @param y event的rowY
* @return 這個(gè)點(diǎn)在不在內(nèi)部RecycleView范圍內(nèi).
*/
public static boolean isTouchValue(RecyclerView recyclerView,float x, float y) {
int[] wh= new int[2];
//觸摸在屏幕上的位置
recyclerView.getLocationOnScreen(pos);
int width = recyclerView.getMeasuredWidth();
int height = recyclerView.getMeasuredHeight();
return x >= wh[0] && x <= wh[0] + width && y >= wh[1] && y <= wh[1] + height;
}
這樣在滑動(dòng)位置處于內(nèi)部Recycleview上的時(shí)候,event就被傳到了內(nèi)部Recycleview中,觸發(fā)內(nèi)部Recycleview的滑動(dòng).不在內(nèi)部Recycleview上的時(shí)候不做處理
最終展示效果

GIF.gif