啊哈,先上应用效果图,符合你的需求,你再继续看这篇博文哈~

类型1 :RecyclerView实现非分页效果的左右滑动
类型2 :ViewPager+RecyclerView实现分页效果的左右滑动

GitHub地址 : https://github.com/xiaoyaomeng/TopicView/tree/master

类型1:RecyclerView实现非分页效果的左右滑动

private void initTypeRecyclerView(int rowNum) {final RecyclerView topicRecyclerView = findViewById(R.id.topicRecyclerView);final View mIndicatorLayout = findViewById(R.id.parent_layout);final View mIndicatorView = findViewById(R.id.main_line);TopicAdapter topicAdapter = new TopicAdapter(getApplicationContext(), mTopicData);topicAdapter.setOnItemClickListener(this);topicRecyclerView.setAdapter(topicAdapter);GridLayoutManager gridLayoutManager = new GridLayoutManager(getApplicationContext(), rowNum);gridLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);topicRecyclerView.setLayoutManager(gridLayoutManager);topicRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);}@Overridepublic void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);//当前RcyclerView显示区域的高度。水平列表屏幕从左侧到右侧显示范围int extent = recyclerView.computeHorizontalScrollExtent();//整体的高度,注意是整体,包括在显示区域之外的。int range = recyclerView.computeHorizontalScrollRange();//已经滚动的距离,为0时表示已处于顶部。int offset = recyclerView.computeHorizontalScrollOffset();//计算出溢出部分的宽度,即屏幕外剩下的宽度float maxEndX = range - extent;//计算比例float proportion = offset / maxEndX;int layoutWidth = mIndicatorLayout.getWidth();int indicatorViewWidth = mIndicatorView.getWidth();//可滑动的距离int scrollableDistance = layoutWidth - indicatorViewWidth;//设置滚动条移动mIndicatorView.setTranslationX(scrollableDistance * proportion);}});}

类型2 :ViewPager+RecyclerView实现分页效果的左右滑动

private void initTypeViewPager(int rowNum, int columnNum) {final ViewPager topicViewPager = findViewById(R.id.topicViewPager);final MagicIndicator topicIndicator = findViewById(R.id.topicIndicator);//1.根据数据的多少来分页,每页的数据为rwint singlePageDatasNum = rowNum * columnNum; //每个单页包含的数据量:2*4=8;int pageNum = mTopicData.size() / singlePageDatasNum;//算出有几页菜单:20%8 = 3;if (mTopicData.size() % singlePageDatasNum > 0) pageNum++;//如果取模大于0,就还要多一页出来,放剩下的不满项ArrayList<RecyclerView> mList = new ArrayList<>();for (int i = 0; i < pageNum; i++) {RecyclerView recyclerView = new RecyclerView(getApplicationContext());GridLayoutManager gridLayoutManager = new GridLayoutManager(getApplicationContext(), columnNum);recyclerView.setLayoutManager(gridLayoutManager);int fromIndex = i * singlePageDatasNum;int toIndex = (i + 1) * singlePageDatasNum;if (toIndex > mTopicData.size()) toIndex = mTopicData.size();//a.截取每个页面包含数据ArrayList<TopicBean> menuItems = new ArrayList<TopicBean>(mTopicData.subList(fromIndex, toIndex));//b.设置每个页面的适配器数据TopicAdapter menuAdapter = new TopicAdapter(getApplicationContext(), menuItems);menuAdapter.setOnItemClickListener(this);//c.绑定适配器,并添加到listrecyclerView.setAdapter(menuAdapter);mList.add(recyclerView);}//2.ViewPager的适配器HomeTopicPagerAdapter menuViewPagerAdapter = new HomeTopicPagerAdapter(mList);topicViewPager.setAdapter(menuViewPagerAdapter);//3.动态设置ViewPager的高度,并加载所有页面int height = dp2px(getApplicationContext(), 76.0f);//这里的80为MainMenuAdapter中布局文件高度LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, mTopicData.size() <= columnNum ? height : height * rowNum);topicViewPager.setLayoutParams(layoutParams);topicViewPager.setOffscreenPageLimit(pageNum - 1);//4.创建指示器CommonNavigator commonNavigator = new CommonNavigator(getApplicationContext());commonNavigator.setAdjustMode(true);final int finalPageNum = pageNum;commonNavigator.setAdapter(new CommonNavigatorAdapter() {@Overridepublic int getCount() {return finalPageNum;}@Overridepublic IPagerTitleView getTitleView(Context context, int index) {return new DummyPagerTitleView(context);}@Overridepublic IPagerIndicator getIndicator(Context context) {LinePagerIndicator indicator = new LinePagerIndicator(context);indicator.setMode(LinePagerIndicator.MODE_EXACTLY);indicator.setLineHeight(UIUtil.dip2px(context, 3));//就是指示器的高indicator.setLineWidth(UIUtil.dip2px(context, 66 / finalPageNum));//就是指示器的宽度,然后通过页数来评分indicator.setRoundRadius(UIUtil.dip2px(context, 3));indicator.setStartInterpolator(new AccelerateInterpolator());indicator.setEndInterpolator(new DecelerateInterpolator(3));indicator.setColors(ContextCompat.getColor(context, R.color.colorAccent));return indicator;}});//5.配置指示器,并和ViewPager产生绑定topicIndicator.setNavigator(commonNavigator);ViewPagerHelper.bind(topicIndicator, topicViewPager);}

Android两种方式实现横向滚动图标+指示器相关推荐

  1. Android 两种方式优雅实现按钮防重复点击,防抖功能

    1. Kotlin 扩展函数实现防抖(Kotlin) 1.1创建ViewExtension.kt文件: fun <T : View> T.withTrigger(delay: Long = ...

  2. android不调用系统发送短信,android之两种方式调用短信发送接口

    释放双眼,带上耳机,听听看~! 相信很多程序员在开发程序的时候都会遇到短信调用端口的情况,今天是技术狗小编为大家带来的关于android之两种方式调用短信发送接口,希望对你学习这方面知识有帮助! an ...

  3. android asynctask源码分析,Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)...

    本文实例讲述了Android通过Handler与AsyncTask两种方式动态更新ListView的方法.分享给大家供大家参考,具体如下: 有时候我们需要修改已经生成的列表,添加或者修改数据,noti ...

  4. com.android.sadk卸载不掉,Android的Service的两种方式以及使用

    Service根据使用方式有两种:startService.bindService. 区别: ①启动方式:前者startService.后者bindService: ②和Activity联系:前者Ac ...

  5. 如何用两种方式同时实现ListBox的滚动功能

    今天,要用WPF实现一个可以通过Windows触屏左右滑动的ListBox控件,并且,同时也可以通过点击两个按钮,进行左右滑动. 实现这个控件,有几个难点: 两种方式,都需要有一个共同的值或方式来记录 ...

  6. 【Android 逆向】Android 进程代码注入原理 ( 注入本质 | 静态注入和动态注入 | 静态注入两种方式 | 修改动态库重打包 | 修改 /data/app/xx/libs 动态库 )

    文章目录 一.注入本质 二.静态注入和动态注入 三.静态注入两种方式 ( 修改动态库重打包 | 修改 /data/app/packageName/libs/ 下的动态库 ) 一.注入本质 进程注入本质 ...

  7. Android中实现SQLite数据库CRUD操作的两种方式

    Android中实现SQLite数据库CRUD操作的两种方式 SQLite是一款轻量级的关系型数据库,具有运行速度.占用资源少的特点.通常只需要几百KB的内存就够了,因此特别适合在移动设备上使用.SQ ...

  8. 创建安卓模拟器的两种方式及常用Android命令介绍

    创建安卓模拟器有以下两种方式: 1>通过图形界面创建,在Eclipse中单击Windows->Android Virtual Device Manager启动图形界面窗口 2>如果用 ...

  9. android动态居中布局,Android动态添加布局的两种方式

    释放双眼,带上耳机,听听看~! 前言 大多数时候我们布局都是用xml来布局的,但有些时候也是会用到动态布局的,尤其是在一些大项目中,动态布局更是体现的淋漓尽致. 所以今天我们就来学习一些动态加添布局的 ...

  10. linux耳机插拔检测,Android应用开发之耳机插拔处理两种方式

    本文将带你了解Android应用开发[RK3288][Android6.0] 耳机插拔处理两种方式,希望本文对大家学Android有所帮助. [RK3288][Android6.0]   耳机插拔处理 ...

最新文章

  1. 对于SD-WAN安全的5个误区
  2. Ubuntu下Qt配置Opencv
  3. PowerShell-Exchange:统计每天邮件收发
  4. 【积累】C/C++中明明该用函数实现的功能,为啥非要自己写代码
  5. 跨浏览器的CSS固定定位{position:fixed}
  6. JDBC事务和JTA事务的区别 --包含spring事务 声明式事务
  7. python 隐马尔科夫_机器学习算法之——隐马尔可夫(Hidden Markov ModelsHMM)原理及Python实现...
  8. Qt学习笔记-SQL的基本操作【创建、查询、添加、索引等】
  9. Tomcat目录和文件讲解
  10. Word+Excel 问题及解决
  11. 自由动力论坛一枝花,全靠汇道童鞋来当家
  12. 电脑黑屏故障的解决方案
  13. Python学习入门基础教程(learning Python)--5.2 Python读文件基础
  14. json mysql php_PHP MySQL连接表作为JSON
  15. MooTools 1.4 源码分析 - Fx
  16. HEX文件解析C语言源代码
  17. 研究svg编辑器过程中遇到的问题总结
  18. SpringBoot 中html的页面间跳转
  19. 【手持式微波频谱分析仪】真正便携且功能强大的仪器 - 欧洲制造
  20. 普通路由器DMZ主机设置及访问方法

热门文章

  1. selenium 如何使浏览器不加载图片和CSS???
  2. 我账户不显示pop3服务器地址,Hotmail 邮箱POP3服务器的设置方法
  3. 在Ubuntu 8.10 中安装使用新一代输入法ibus Deb包下载
  4. conversational recommender system论文笔记;推荐系统(recommender system)+对话系统(dialogue system)
  5. java中finish什么意思,finish是什么意思(你知道Finish 和 Complete 的区别吗?)
  6. wordpress pdf_9个适用于WordPress的最佳PDF插件
  7. springboot 发送短信
  8. java.lang.IllegalStateException: focus search returned a view that wasn‘t able to take focus!
  9. linux中opt是啥文件夹,linux根目录的各文件夹里装了什么
  10. python对文件的读操作方法是什么_Python文件的读写操作