• RecyclerView 空白区域点击事件


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

    目前点击空白位是没有点击响应事件的,我们想实现点击响应以扩大用户可以进入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小于某个数,认为手指没有滑动,这样就完美屏蔽了手势滑动,只监听点击事情了!

    到此完美解决! 

  • 相关阅读:
    【kafka】十四、kafka生产者API
    创建Asp.net MVC项目实现视图页面数据传值显示
    NFS服务器搭建与管理
    实现一个简单的长轮询
    2021.06青少年软件编程(Python)等级考试试卷(二级)
    对象的解构赋值(基本用法1)
    华为机试真题 Python 实现【过滤组合字符串】【2022.11 Q4新题】
    js设计模式
    【ML】使用 ARIMA 进行时间序列预测
    干了5-6年的测试,最后晋升是因为这个项目...
  • 原文地址:https://blog.csdn.net/Jason_HD/article/details/133787067