Android Studio - 第四十三期 RecyclerView存在大量Item时,当滚到底部时快速滑到顶部

在使用RecyclerView展示图片或者其他信息时,往往需要展示很多的Item,当滚到底部时又想回到顶部,如果一点一点的向上划去比较麻烦,而且用户体验不好。因此添加一个快速回到顶部的按钮是很有必要的,并且刚开始的时候这个按钮是隐藏的,当滑动超过超过一屏的时候才会出现,在滑动的过程中也是不会出现的。很多类似的项目都会使用到,但是如何在快速回到顶部的过程中不出现卡顿,体现的很是流畅,这点很重要。下面是我根据网上的方法自己修改的一个可以快速回到顶部的类,在此做一下备注,以便日后查看:

1.FastScrollManger.java

import android.content.Context;
import android.graphics.PointF;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.LinearSmoothScroller;
import android.support.v7.widget.RecyclerView;
import android.util.DisplayMetrics;

/**
 * 快速回到RecyclerView 的顶部,不会出现卡顿
 */

public class FastScrollManger extends LinearLayoutManager {
    public FastScrollLinearLayoutManager(Context context) {
        super(context);
    }

    public FastScrollLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
        super(context, orientation, reverseLayout);
    }

    @Override
    public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) {
        LinearSmoothScroller linearSmoothScroller = new LinearSmoothScroller(recyclerView.getContext()) {

            @Override
            public PointF computeScrollVectorForPosition(int targetPosition) {
                return FastScrollLinearLayoutManager.this.computeScrollVectorForPosition(targetPosition);
            }

            //控制速度。
            @Override
            protected float calculateSpeedPerPixel(DisplayMetrics displayMetrics) {
                return super.calculateSpeedPerPixel(displayMetrics);
            }
            @Override
            protected int calculateTimeForScrolling(int dx) {
                if (dx > 3000) {
                    dx = 3000;
                }

                int time = super.calculateTimeForScrolling(dx);
                return time;
            }
        };

        linearSmoothScroller.setTargetPosition(position);
        startSmoothScroll(linearSmoothScroller);
    }
}

2.使用

mRecyclerView = (RecyclerView) findViewById(R.id.activity_recyclerview);
        LinearLayoutManager layout = new FastScrollManager(CustomActivity.this, LinearLayoutManager.VERTICAL, false);
        mRecyclerView.setLayoutManager(layout);//竖直放置        ...
        mRecyclerView.setAdapter(mMyAdapter);
        mRecyclerView.addOnScrollListener(new MyRecyclerViewScrollListener());

3.控制显示与隐藏

//滑动监听
    private class MyRecyclerViewScrollListener extends RecyclerView.OnScrollListener {
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();
            int firstVisibleItemPosition = manager.findFirstVisibleItemPosition();
            // 当不滚动时
            if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                // 判断是否滚动超过一屏
                if (firstVisibleItemPosition == 0) {
                    mImageViewRebackTop.setVisibility(View.INVISIBLE);
                } else {
                    mImageViewRebackTop.setVisibility(View.VISIBLE);
                }

            } else if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {//拖动中
                mImageViewRebackTop.setVisibility(View.INVISIBLE);
            }
        }
    }

4.点击回到顶部按钮的时候,回到顶部

mRecyclerView.smoothScrollToPosition(0);

附:执着的念想~

时间: 2024-08-22 12:52:34

Android Studio - 第四十三期 RecyclerView存在大量Item时,当滚到底部时快速滑到顶部的相关文章

Android Studio第三十三期 - 蓝牙开发初识~

遇见到坑爹的队友只有接受现实并且解决问题~ 首先介绍一下网上几乎所有的能搜到的方法: 1.首先,要操作蓝牙,先要在AndroidManifest.xml里加入权限 <uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permissionandroid:name="android.permission.BLUETOOTH" /> 2.在androi

Android Studio - 第四十八期 模块ViewPager+Fragment

最近一直在review撸撸的代码,发现了一种模块的写法,非常不错,独立出来,希望能帮到你~ 如果你遇到这样的页面,怎么办,不会把所有代码都写到一个页面中吧~,这样看你代码的人会骂死你的吧~我想~而且如果不同的版本要用不同的位置,大小也不一样,难道你要重新布局嘛~这都是开发中需要纠结的,下面就开始正题了,这是利用了以前讲过的多版本打版以及配置多Fragment加载巧妙的解决了复杂的页面逻辑,我数了数,首页代码不到一百行,厉害吧~哈哈哈哈~ 在写这样的页面之前给大家介绍一下怎么写一个页面模块代码.

Android Studio - 第四十六期 不会AAR的轮播写法

最近在学习撸撸的代码,发现他的轮播写法很独特,但是有bug,就重新修改了一下,现在支持左右点击和圆点自定义. BannerAdapter:(注意适配器自己看ImageView和onclick的自己项目的写法~) package com.example.p029_banner_lunbo.adapter; import android.app.Activity; import android.view.View; import android.view.ViewGroup; import andr

Android Studio - 第四十五期 Gradle manifestPlaceholders

最近在学习撸撸的代码规范和写法,有些心得,准备好好写一写~包括了多渠道打版(以前有写过方法),工厂模式,mvp,以及最近刚封装出来的多渠道多版本展示不同页面的manifestPlaceholders的配置方法,大家应该也碰到过线上和线下环境的切换换地址,换私钥的头大问题,本篇就来解决这些问题. 先在androidmanifest文件配置一个节点,这里以极光为例: <meta-data             android:name="JPUSH_APPKEY"         

Android Studio 第五十三期 - 自定义EditText密码键盘

代码已经整理好,效果如下图: code:         //设置输入为密码模式         inputETP1.setInputType(InputType.TYPE_CLASS_NUMBER | EditorInfo.TYPE_NUMBER_VARIATION_PASSWORD);         inputETP1.setDrawableRightListener(new EditTextPassword.DrawableRightListener() {             @O

Android Studio第四十期 - 上传头像功能支持权限管理

代码已经整理好,加了权限管理和SP保存上传服务器的方法,希望能够帮到大家~效果如下图: 地址:https://github.com/geeklx/MyApplication/tree/master/p025_upload_img 附:这里借鉴了翔神(http://blog.csdn.net/lmj623565791/article/details/72859156)的写法,大家可以好好学习一下~哈哈~

Android Studio - 第四十二期 几个经常用到的字符串的截取

string str="123abc456"; int i=3; 1 取字符串的前i个字符 str=str.Substring(0,i); // or  str=str.Remove(i,str.Length-i); 2 去掉字符串的前i个字符: str=str.Remove(0,i);  // or str=str.Substring(i); 3 从右边开始取i个字符: str=str.Substring(str.Length-i); // or str=str.Remove(0,s

Android Studio 第六十三期 - Android框架 -RecycleView所有用法

最近在review代码,发现很多东西可以独立出来,效果如下图: github地址:https://github.com/geeklx/APPkuangjia/tree/master/baselibrary/src/main/java/com/haier/cellarette/baselibrary/recycleviewalluses 原文地址:http://blog.51cto.com/liangxiao/2136795

Android Studio 第七十三期 - Android Glide4.7.3用法大全支持九宫格

代码已经整理好,效果如下图: 地址:https://github.com/geeklx/myapplication2018/tree/master/p016_glide47_quan 原文地址:http://blog.51cto.com/liangxiao/2150525