• Stars
    star
    397
  • Rank 108,561 (Top 3 %)
  • Language
    Java
  • Created about 8 years ago
  • Updated over 6 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

一行代码让RecyclerView变身ViewPager

HorizontalPage

一行代码让RecyclerView变身ViewPager #序言

我曾经写过一个使用RecycleView打造水平分页GridView。当时用到的是对数据的重排序,但是这样处理还是有些问题,比如用户数据更新以后还需要继续重排序,包括对滑动事件的处理也不是很好。当时主要因为时间比较匆忙,写的不是很好,这一次我将采用自定义LayoutManger的方式实现水平分页的排版,使用一个工具类实现一行代码就让RecycleView具有分页滑动的特性。

#效果

1.水平分页的效果(采用了自定义LayoutManger+滑动工具类实现),关键是不需要修改Adapter,可以用来实现表情列表,或者是商品列表。

这里写图片描述

2.垂直方向的分页显示,可以实现读报的功能,或者其他需要一页一页阅读的功能,采用了LinearLayoutManger+滑动工具类实现,比使用LinearLayout布局的优势在于实现了View的复用。

这里写图片描述

3.水平分页,这是使用LinearLayoutManger+分页滑动工具类实现的,这样LinearLayout就可以横向的一页一页显示,用这个实现Banner要比ViewPager要简单很多,性能也会有所提高。因为ViewPager自己并没有缓存机制。

这里写图片描述

其实还可以实现很多其他的功能,限于我的想象力有限就先举这些例子吧。

#使用

1.要想数据按一页一页的排列就使用HorizontalPageLayoutManager,在构造方法中传入行数和列数就行了

   //构造HorizontalPageLayoutManager,传入行数和列数
   horizontalPageLayoutManager = new HorizontalPageLayoutManager(3,4);
   //这是我自定义的分页分割线,样式是每一页的四周没有分割线。大家喜欢可以拿去用
   pagingItemDecoration = new PagingItemDecoration(this, horizontalPageLayoutManager);

2.分页滚动,上一步的HorizontalPageLayoutManager只负责Item分页的排列和回收,而要实现分页滚动需要使用PagingScrollHelper 这个工具类。注意这个工具类很强的,使用其他的LayoutManger也可以和这个工具类共同使用实现分页效果。

  PagingScrollHelper scrollHelper = new PagingScrollHelper();
  scrollHelper.setUpRecycleView(recyclerView);
  //设置页面滚动监听
  scrollHelper.setOnPageChangeListener(this);

滑动监听类


    public interface onPageChangeListener {
        void onPageChange(int index);
    }

注意

1。用于使用了RecyclerView的OnFlingListener,所以RecycleView的版本必须要25以上。

这里写图片描述

2。如果想使用自定义的LayoutManger实现分页滑动,则必须实现LayoutManger的这两个方法之一,因为工具类是通过这两个方法判断应该怎么滚动的。


        /**
         * Query if horizontal scrolling is currently supported. The default implementation
         * returns false.
         *
         * @return True if this LayoutManager can scroll the current contents horizontally
         */
        public boolean canScrollHorizontally() {
            return false;
        }

        /**
         * Query if vertical scrolling is currently supported. The default implementation
         * returns false.
         *
         * @return True if this LayoutManager can scroll the current contents vertically
         */
        public boolean canScrollVertically() {
            return false;
        }

#2018-02-27 更新

1.解决需要点击两次才能刷新的bug(感谢评论区里面的小伙伴) 2.提供滚动到指定页面的方法,可以配合数据刷新。

	   myAdapter.notifyDataSetChanged();
        //滚动到第一页
        scrollHelper.scrollToPosition(0);

3.提供获取总页数的方法。目前支持的有LinearLayoutManager,StaggeredGridLayoutManager,HorizontalPageLayoutManager(我自己写的),如果你想自己的LayoutManger也能获取到总页数,请实现相应的方法。 下面三个是能横向滚动的LayoutManger,能竖直滚动的有对应的三个方法。

  @Override
    public int computeHorizontalScrollRange(RecyclerView.State state) {
       return 0;
    }

    @Override
    public int computeHorizontalScrollOffset(RecyclerView.State state) {
        return 0;
    }

    @Override
    public int computeHorizontalScrollExtent(RecyclerView.State state) {
        return 0;
    }

获取总页数的方法

 //获取总页数,采用这种方法才能获得正确的页数。否则会因为RecyclerView.State 缓存问题,页数不正确。
 //第一次,和每一次更新adapter以后。需要使用这样的方法获取。
        recyclerView.post(new Runnable() {
            @Override
            public void run() {
                tv_page_total.setText("共" + scrollHelper.getPageCount() + "页");
            }
        });

最后的最后,感谢小伙伴的支持。没想到这几百行的小工具这么收欢迎。大家还有bug,欢迎反馈。

More Repositories

1

PageGridView

支持纵向,横向,水平分页的gridview
Java
77
star
2

MehodInterceptor

使用asm实现的方法拦截器
Java
68
star
3

VideoDemo

视频播放技术汇总
Java
55
star
4

ApkPublishDemo

最强Android 打包插件,支持fir,蒲公英上传, 360加固 ,自动生成二维码
Java
51
star
5

WXSoundRecord

仿微信录音的库
Java
50
star
6

StyleDemo

一种简单的换肤框架
Java
47
star
7

ChannelMangerDemo

实现类似网易新闻频道管理功能,包含UI和数据库
Java
45
star
8

SmartDemo

一个用于快速开发复杂List布局的框架
Java
30
star
9

OffLineReaderDemo

使用webview实现离线阅读
Java
28
star
10

PrivacyHelperForAndroidSupport

一个帮助完成隐私权限的库
Java
22
star
11

autoSignApk

通过配置文件,可以自动签名apk,直接拖入apk文件即可
Java
21
star
12

WeiXinPictureTool-master

Java
17
star
13

LiveDemo

直播与聊天室功能的demo
Java
17
star
14

PageReader

智能阅读(逐字朗读+自动滚屏)
Java
14
star
15

MVPDemo

使用MVP搭建项目框架
Java
12
star
16

user-state-check

基于AOP实现用户状态检测的框架
Java
11
star
17

permission-aim-tip

用于在申请权限之前,自动添加权限目的提示框告知用户。以实现隐私适配
Java
10
star
18

AppPublish

打包助手中GUI相关的功能,最后输出一个jar包,供打包助手使用
Java
9
star
19

StackLayout

一个自定义层叠layout
Java
8
star
20

Android-Cglib

也可以在Android中使用的cglib
Java
7
star
21

ScaleSelector

自定义卡尺选择器
Java
6
star
22

MapView

可以显示svg地图的控件
Java
5
star
23

ScanCodeDemo

Java
4
star
24

PrimaryColorDemo

可以动态设置图片的主题色
Java
4
star
25

Captcha

手机号验证
Java
4
star
26

LocationDemo

将百度地图封装成libaray
Java
4
star
27

Android-Javassist

在android上实现Javassist。将原来的项目使用gradle跑起来了
Java
4
star
28

CollapsibleListViewDemo

带头部可折叠的Listview
Java
4
star
29

TRSTOAST

可滑动删除的Toast
Java
3
star
30

TrigangleLayoutDemo

一个三角形和梯形布局
Java
3
star
31

TAGDemo

用于生成行内标签的工具
Java
2
star
32

RealTimeTest

网页版直播和聊天室
JavaScript
2
star
33

AppActivityName

可以获取手机中正在运行app的当前的activity,和其中包含的fragment
Java
2
star
34

UTF8Demo

群发短信的工具APP
Java
2
star
35

LoopScrollView

可以循环滚动的ScrollView
Java
2
star
36

GSYVideoPlayer2024

替换测试数据
Java
1
star
37

AutoRegister

通过注解可以自动收集类信息的工具类
Java
1
star
38

slideBar

用于全屏侧滑,和ViewPager2兼容的侧滑控件
Java
1
star
39

OrderLayoutDemo

Java
1
star
40

WeatherTextViewDemo

带天气图标的TextView
Java
1
star
41

TouchLearn

学习触摸事件分发的工具项目
Java
1
star
42

XmlRecycleView

可以直接在xml文件中配置的RecycleView
Java
1
star
43

FloatAroundLayout

可以围绕中心点旋转的自定义layout
Java
1
star
44

auto360

实现360自动加固
Java
1
star
45

WalkMaze

可自定义的可视化求解迷宫的算法演示demo
Java
1
star
46

GitLabWorkList

用于查询GitLab上某个人某段时间的工作内容,按照项目和分支进行分支,按照时间进行排序。
Java
1
star
47

CardLayout

可以上,左右,删除内容,向下滑,返回上一个。支持adapter,支持复用的布局
Java
1
star
48

Circular_QR_Code

可以生成圆形二维码的工具
Java
1
star