在项目中使用RecyclerView展示列表数据,用了GridLayoutManager,在遇到item个数不满足一行时,会在页面右侧透出空白位, 如下图所示.
目前点击空白位是没有点击响应事件的,我们想实现点击响应以扩大用户可以进入LandingPage的机会,在实现角度可以通过以下三种方式去实现:
1.重写RecyclerView的onMeasure实现宽度自适应
2.实现EmptyItem占位空白区域并给出点击事件
3.针对RecyclerView实现空白区域点击
本着最小改动的原则,我们采用了第三种方案进行探索。
常规的想法:为RecyclerView设置setOnTouchListener(),监听点击手势,并且通过onTouch(View v,MotionEvent event)中v.getId!=0 可以区分出是RecyclerView的空白区域。
基于以上知识点,可以实现空白区域的点击事件监听:
mRecyclerView.setOnTouchListener((v, event) -> {if (event.getAction() == MotionEvent.ACTION_UP) {if (v.getId() != 0) {//recyclerView空白处点击事件}}return false;});
将上面的写到项目中,测试下基本可以实现需求,但是有个问题,当用户做滑动手势的时候也会触发上面的事件,接下来继续再优化下,屏蔽掉手势滑动:
float scrollX;
float scrollY;
mRecyclerView.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_DOWN) {scrollX = event.getX();scrollY = event.getY();}if (event.getAction() == MotionEvent.ACTION_UP) {if (v.getId() != 0 && Math.abs(scrollX - event.getX()) <= 5 && Math.abs(scrollY - event.getY()) <= 5) {//处理空白区域的点击事件}}return false;}});
增加MotionEvent.ACTION_DOWN动作的监听,在MotionEvent.ACTION_UP动作中比较dx和dy,dx和dy小于某个数,认为手指没有滑动,这样就完美屏蔽了手势滑动,只监听点击事情了!
到此完美解决!