大海话语 2022-01-07 20:09 采纳率: 87.6%
浏览 115
已结题

Fragment中实现RecyclerView滑动监听后,调用setOnTouchListener。

我现在做一个在Fragment里面将RecyclerView滑动后,本身做一个调整后,再调用或者触发整个屏幕的一个监听事件,但是,我实现的时候呢,却不起作用。
先是直接调用在RecyclerView中,后,又试了下,在onViewCreated中先初始化一下,但是,还是不行呢?
下面是Fragment里面的RecyclerView滚动监听的一些写法

private void initRecyclerSlide() {
        RecyclerView.LayoutManager layoutManager = mRecyclerView.getLayoutManager();
        /*
         * 判断是当前layoutManager是否为LinearLayoutManager
         * 只有LinearLayoutManager才有查找第一个和最后一个可见view位置的方法
         * */
        if (layoutManager instanceof LinearLayoutManager) {
            LinearLayoutManager linearManager = (LinearLayoutManager) layoutManager;
            //获取最后一个可见view的位置
            int lastItemPosition = linearManager.findLastVisibleItemPosition();
            if (lastItemPosition == 0) {
//                setMarginTop(tuyuBigPage.getHeight() + tuyuMiddlePage.getHeight() );//下拉时,大图加小图,因为减过
//                tuyuBigPage.setVisibility(View.VISIBLE);
            }
            //获取第一个可见view的位置
            int firstItemPosition = linearManager.findFirstVisibleItemPosition();
            if (firstItemPosition == 0) {
//                tuyuBigPage.setVisibility(View.INVISIBLE);
//                setMarginTop(tuyuBigPage.getHeight() - tuyuMiddlePage.getHeight());//上滑时 大头部 减 要隐藏的头部
            }

        }

        //RecyclerView 上推 隐藏
        //RecyclerView 上推 隐藏
        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                initListener();
                if (dy < 0) {
                    tuyuBigPage.setVisibility(View.VISIBLE);
                    setMarginTop(tuyuBigPage.getHeight() + tuyuMiddlePage.getHeight());//下拉时,大图加小图,因为减过
                } else if (dy > 0) {
                    tuyuBigPage.setVisibility(View.INVISIBLE);
                    setMarginTop(tuyuBigPage.getHeight() - tuyuMiddlePage.getHeight());//上滑时 大头部 减 要隐藏的头部
                }
//                RecyclerViewUtils.getInstance().reCircleMenu.bringToFront();
//                reCircleMenu.bringToFront();
            }

            @Override
            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
//                    tuyuBigPage.setVisibility(View.INVISIBLE);
                } else if (newState == RecyclerView.SCROLL_STATE_IDLE) {
//                    tuyuBigPage.setVisibility(View.VISIBLE);
                }
            }
        });
    }

下面是Fragment里面整个屏幕的一个方法

//触碰监听
    public void initListener() {
        //触碰监听
        TuyuFragment.this.myOnTouchListener = new MyOnTouchListener() {
            @Override
            public boolean dispatchTouchEvent(MotionEvent ev) {//就是这个 dispatchTouchEvent  没有在Fragment里面重写
                return dispathTouchEvent(ev);
            }
        };
        registerMyOnTouchListener(myOnTouchListener);
    }

//---------------------------------设置隐藏头部
    private boolean dispathTouchEvent(MotionEvent event) {
        if (mIsAnim) {
            return false;
        }
        final int action = event.getAction();  //得到移动

        float x = event.getX();  //移动横轴
        float y = event.getY();  //移动竖轴

        switch (action) {
            case MotionEvent.ACTION_DOWN:
                lastY = y;
                lastX = x;
                return false;
            case MotionEvent.ACTION_MOVE:
                float dY = Math.abs(y - lastY);  //当前竖移动点 减 0值
                float dX = Math.abs(x - lastX);  //当前横移动点 减 0值
                boolean down = y > lastY ? true : false; //当前竖移动点 > 0值
                lastY = y;
                lastX = x;
                isUp = dX < 8 && dY > 8 && !mIsTitleHide && !down; //手指Up状态:如果横不小于8 竖不大于8,  隐藏为真或不是down时
                isDown = dX < 8 && dY > 8 && mIsTitleHide && down; //手指Down状态:如果横不小于8 竖不大于8,  隐藏为假或是down时
                if (isUp) {
                    View view = this.tuyuBigPage;
                    float[] f = new float[2];
                    f[0] = 0.0F;
                    f[1] = -tuyuMiddlePage.getHeight();//获取要隐藏的 高度
                    ObjectAnimator animator1 = ObjectAnimator.ofFloat(view, "translationY", f);
                    animator1.setInterpolator(new AccelerateDecelerateInterpolator());
                    animator1.setDuration(500);//设置动画时间
                    animator1.start();
                    animator1.addListener(this);
                    tuyuPlayBar000.setVisibility(View.INVISIBLE);
                    setMarginTop(tuyuBigPage.getHeight() - tuyuMiddlePage.getHeight());//大头部 减 要隐藏的头部
                } else if (isDown) {
                    View view = this.tuyuBigPage;
                    float[] f = new float[2];
                    f[0] = -tuyuMiddlePage.getHeight();
                    f[1] = 0F;
                    ObjectAnimator animator1 = ObjectAnimator.ofFloat(view, "translationY", f);
                    animator1.setDuration(300);
                    animator1.setInterpolator(new AccelerateDecelerateInterpolator());
                    animator1.start();
                    animator1.addListener(this);
                } else {
                    return false;
                }
                mIsTitleHide = !mIsTitleHide;
                mIsAnim = true;
                break;
            default:
                return false;
        }
        return false;

    }

这个屏幕监听事件在单独使用时,能够生效,就是在RecyclerView实现后,再调用它,却不成功。
因为,我想做一个将Recycler下滑动时,隐藏一些头部,让Recycler上浮,再下拉时,再将头部下拉致原来的位置。。

  • 写回答

2条回答 默认 最新

  • pumpkin的玄学 2022-01-08 07:59
    关注

    registerMyOnTouchListener这个代码看一看

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月16日
  • 已采纳回答 1月8日
  • 修改了问题 1月7日
  • 创建了问题 1月7日

悬赏问题

  • ¥15 写一个可直接调用的函数,将32位有符号数转成另一个无符号的数
  • ¥15 CMAKE+VS2019+QT5.15.2组合进行二次编译
  • ¥15 nginx 配置静态html访问 ,后台登录时页面始终被重定向到登录页,无法访问到后台的静态html页
  • ¥20 自动登录的j2ee程序编译
  • ¥15 fluent模拟静态气体扩散
  • ¥15 java根据模板,生成word文档,需要带目录
  • ¥15 广告联盟的兜底广告是什么意思
  • ¥15 如何证明高斯噪声的包络公式
  • ¥150 寻找王者荣耀开发作者,合作或者解答
  • ¥15 关于cpci总线的几个问题,别用人工智能回答