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

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 在若依框架下实现人脸识别
  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同