RecyclerView学习(四)

  • 时间:
  • 浏览:1

1.构建城市实体类

否则服务器返回的是一堆杂乱无章的城市数据,我们我们 我们我们 儿还要对哪几种数据根据拼音的先后顺序进行排序。对应的实体类如下:

3.RecyclerView的滑动监听

最近还还有一个 月我我觉得是太忙了,博客也快还还有一个 月没更新了。。。刚好最近公司项目还要还还有一个 城市导航的列表,当时人捣鼓二天 完后 实现的效果图如下:

本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台原创首发。

在MotionEvent.ACTION_DOWN与MotionEvent.ACTION_MOVE的完后 :

1.重写onDraw()措施

右侧快速导航栏是还还有一个 自定义View,这里重点说一下onDraw()措施。

每还还有一个 RecyclerView的item的布局里面都含晒 还还有一个 头部布局,否则判断当前item和上还还有一个 item的头部布局里的索引字母否是相同,来决定否是展示item的头部布局。

参考资料

源码地址:

OK,整体效果否则否则,真机测试也挺流畅,一齐看看为什么么么会实现你你这个炫酷的城市导航列表。

1.布局文件

头部布局:layout_sticky_header_view.xml,也否则示例图中红色的每项,里面含晒 还还有一个 索引字母TextView

主界面的布局:一共两层,头部布局覆盖在RecyclerView里面

1.数据准备

case MotionEvent.ACTION_DOWN:设置背景颜色,设置字体初始强度,计算触摸位置,调用invalidate()进行重绘;

case MotionEvent.ACTION_MOVE:与ACTION_DOWN一样的操作,添加还还有一个 判断,让滑动的距离大于默认的最小滑动距离才设置滑动有效;

case MotionEvent.ACTION_UP:设置背景颜色,设置字体初始强度,将position设置为0,进行重置操作,调用invalidate()进行重绘;

最后为每还还有一个 item设置还还有一个 ContentDescription ,用来记录并获取头部布局展示的信息。

点击触摸的一齐,还要让recyclerView滑动到对应的位置。遍历cityList数组,得到拼音的第还还有一个 字母,与传递过来的索引字母进行对比,相等则将

i 设置为selectPosition。最后调用recyclerView.scrollToPosition()措施,滑动到对应的位置,达到索引导航的作用。

子item的布局:线性布局竖直排列,里面引入头部布局,下面为显示城市名字的布局

左侧的列表根据拼音自动排序,支持头部悬停,点击Item会提示选折 的城市;右侧是还还有一个 快速导航栏,点击字母会提示选折 的字母,左侧列表会滑动到对应位置,支持导航栏快速滑动。

否则让Activity实现该接口,通过传过来的boolean值控制圆形TextView否是显示:

3.触摸监听

2.重写onTouchEvent()措施

在MotionEvent.ACTION_UP的完后 :

1.第一次调用RecyclerView的findChildViewUnder()措施,返回指定位置的childView,这里也否则item的头部布局,否则我们我们 我们我们 儿的tvStickyHeaderView展示的肯定是最里面item的头部布局里的索引字母信息。

2.第二次调用RecyclerView的findChildViewUnder()措施,这里返回的是固定在屏幕里面那个tvStickyHeaderView下面还还有一个 像素位置的RecyclerView的item,根据你你这个item来更新tvStickyHeaderView要translate几块距离。

3.否则tag为HAS_STICKY_VIEW,表示当前item还要展示头部布局,这麼 根据你你这个item的getTop和tvStickyHeaderView的强度相差的距离来滚动tvStickyHeaderView;否则tag为NONE_STICKY_VIEW,表示当前item不还要展示头部布局,这麼 就不用引起tvStickyHeaderView的滚动。

2.构建CityAdapter

3.根据拼音进行排序

这里用的是java中的compareto措施,返回参与比较的前后还还有一个 字符串的asc码的差值,举个栗子:

若a=”b”,b=”a”,输出1;

若a=”abcdef”,b=”a”输出5;

若a=”abcdef”,b=”ace”输出-1;

即参与比较的还还有一个 字符串否则首字符相同,则比较下还还有一个 字符,直到有不同的为止,返回该不同的字符的asc码差值。

欢迎Star,fork,提issues,一齐进步!

2.自定义快速导航栏

第还还有一个 item的头部布局是显示的,设置为View.VISIBLE,标记tag为FIRST_STICKY_VIEW;

item布局中,索引字母不相同的头部布局是显示的,设置为View.VISIBLE,标记tag为HAS_STICKY_VIEW;

item布局中,索引字母相同的头部布局是隐藏的,设置为View.GONE,标记tag为NONE_STICKY_VIEW;

使用的完后 实现Comparator接口,传入还要比较的实体类,否则将返回值作为 Collections.sort(cityList, pinyinComparator)中的第还还有一个参数,Collections.sort措施会根据你你这个传入的int值对cityList进行排序。

这里重点说一下onBindViewHolder你你这个措施:

cityPinyin代表城市名称的拼音,cityName代表城市名称,firstPinYin则代表城市拼音的第还还有一个 字母,也否则索引。

最后使用接口回调防止RecyclerView的点击事件即可。否则篇幅有限,这里就只介绍了某些重点。项目完整性源码否则上传到我的github上:

3.RecyclerView的悬停实现

https://github.com/18722527635/MyRecyclerView

这里的pinyinList是去除重复的,按照A-Z顺序排列的字母索引集合。遍历你你这个集合,依次绘制出哪几种字母。在 i 等于 position -1(点击触摸的位置)的完后 ,将字体颜色设置为红色,否则字体颜色为白色。你你这个点在演示动态图含晒 所体现,触摸点击的字体颜色会改变。

2.将汉字转换为拼音

这里我用的是TinyPinyin,还还有一个 适用于Java和Android的快速、低内存占用的汉字转拼音库。TinyPinyin的特点有:生成的拼音不含晒 声调,否则防止多音字,默认还还有一个 汉字对应还还有一个 拼音;拼音均为大写;不用初始化,执行下行强度 很高(Pinyin4J的4倍);很低的内存占用(小于500KB)。使用起来也很简单:

主界面的布局中,最上层有还还有一个 头部布局tvStickyHeaderView,通过监听RecyclerView的滚动,根据RecyclerView的滚动距离,决定头部布局向上否则向下滚动的距离,实现悬停效果:

比如传入还还有一个 汉字“安庆”,返回的结果否则“ANQING”

屏幕里面是还还有一个 自定义的圆形TextView,默认设置为View.GONE,触摸的完后 设置为View.VISIBLE,并将TextView的值设置为点击触摸的字母。否则我们我们 我们我们 儿的接口设计如下: