RecyclerView 空白区域点击事件

忘是亡心i 2024-02-22 08:54 175阅读 0赞

在项目中使用RecyclerView展示列表数据,用了GridLayoutManager,在遇到item个数不满足一行时,会在页面右侧透出空白位, 如下图所示.

be29162581c24c55925cbf3e065baa3c.jpeg

目前点击空白位是没有点击响应事件的,我们想实现点击响应以扩大用户可以进入LandingPage的机会,在实现角度可以通过以下三种方式去实现:

1.重写RecyclerView的onMeasure实现宽度自适应
2.实现EmptyItem占位空白区域并给出点击事件
3.针对RecyclerView实现空白区域点击

本着最小改动的原则,我们采用了第三种方案进行探索。

常规的想法:为RecyclerView设置setOnTouchListener(),监听点击手势,并且通过onTouch(View v,MotionEvent event)中v.getId!=0 可以区分出是RecyclerView的空白区域。

基于以上知识点,可以实现空白区域的点击事件监听:

  1. mRecyclerView.setOnTouchListener((v, event) -> {
  2. if (event.getAction() == MotionEvent.ACTION_UP) {
  3. if (v.getId() != 0) {
  4. //recyclerView空白处点击事件
  5. }
  6. }
  7. return false;
  8. });

将上面的写到项目中,测试下基本可以实现需求,但是有个问题,当用户做滑动手势的时候也会触发上面的事件,接下来继续再优化下,屏蔽掉手势滑动:

  1. float scrollX;
  2. float scrollY;
  3. mRecyclerView.setOnTouchListener(new OnTouchListener() {
  4. @Override
  5. public boolean onTouch(View v, MotionEvent event) {
  6. if (event.getAction() == MotionEvent.ACTION_DOWN) {
  7. scrollX = event.getX();
  8. scrollY = event.getY();
  9. }
  10. if (event.getAction() == MotionEvent.ACTION_UP) {
  11. if (v.getId() != 0 && Math.abs(scrollX - event.getX()) <= 5 && Math.abs(scrollY - event.getY()) <= 5) {
  12. //处理空白区域的点击事件
  13. }
  14. }
  15. return false;
  16. }
  17. });

增加MotionEvent.ACTION_DOWN动作的监听,在MotionEvent.ACTION_UP动作中比较dx和dy,dx和dy小于某个数,认为手指没有滑动,这样就完美屏蔽了手势滑动,只监听点击事情了!

到此完美解决!

发表评论

表情:
评论列表 (有 0 条评论,175人围观)

还没有评论,来说两句吧...

相关阅读