注:RecyclerVIew不仅可以实现和ListView同样的效果,还有优化了ListView中的各种不足。RecyclerVIew既可以实现数据纵向滚动,也可以实现横向滚动,而ListView做不到横向滚动
要先在app文件夹下的build.gradle中导包,别导错位置了
implementation 'androidx.recyclerview:recyclerview:1.1.0'
别忘了点右上角同步一下
或者点这个小象也能同步
因为RecyclerView和ListView很相似,所以有些代码是可以共用的
我们直接把之前写的ListView中的Bean和activity_main.xml复制过去
当然activity_main.xml中这里的ListView要改成RecyclerView依赖包的全类名
id别忘了改一下,我改成rv
再创建一个recyclerview_item
和之前的list_item差不多
MainActivity中的数据也一样
同样,也创建一个MyAdapter
注:但是这个MyAdapter和ListView中的不一样了,ListView的MyAdapter是直接继承的BaseAdapter,
而RecyclerView
而RecyclerView继承的Adapter中可以看到是一个泛型,而我们一般可以在这个泛型中再写一个类
注:这个MyViewHolder可以联想到之前在ListView中为了优化性能,我们自己创建的ViewHolder类,
而RecyclerView为了统一这样的格式,直接让我们在继承Adapter去实现MyAdapter的时候,就强制性让我们去创建一个ViewHolder,这样就避免了我们在使用ListView的时候没有使用ViewHolder进行优化的情况。
所以这也是RecyclerView比ListView不一样的厉害的一点
继续,alt+enter创建一下MyViewHolder类
再alt+enter导入一下方法
发现这里还有问题
因为我们创建的
只是一个普通类,MyViewHolder还需要继承
然后我们再alt+enter创建构造方法
这样我们的MyAdapter初步完成
接着我们再把数据传进来,和ListView一样,需要通过外部传
先把数据导入
回到MainActivity,拿到activity_main.xml中RecyclerView的id:rv
注:所以其实之前构造方法中的itemView就是这个onCreateViewHolder中的view
那么我们findViewById在哪处理呢,其实是在MyViewHolder中处理
还有一个
注意此时还不能直接run
回到MainActivity
这个地方,其实我们还需要给recyclerView进行布局
注:在ListView中的时候,是不需要布局的,因为ListView默认就是垂直布局,而RecyclerView在这里把布局模块给抽离了出来,所以这样就会使RecyclerView布局更加的灵活
回到MainActivity中
run一下,和ListView差不多了(虽然还没设置点击事件)
除了线性布局,还有一些其他的布局
网格的布局,后面int的那个参数就是要我们一行显示几个
run一下
还有一个瀑布流的布局
StaggeredGridLayoutManager()的源码:
所以
可以这样写,但是实际上还能简单一些,
其实源码中就是使用的LinearLayout.VERTICAL或者LinearLayout.HORIZONTAL
run一下发现好像和网格的一样啊,其实不然,我们去上面的for循环中改一下数据
run一下
发现对不齐,产生了错位现象,那我们重新用网格布局看看效果
网格布局还是对的很齐的
所以瀑布流布局,顾名思义,和瀑布一样,顺着下来,不会留空白
注:更多LayoutManager进阶技术还可以实现自定义,实现更多炫酷的布局
接下来实现ltem的点击效果
注:因为RecyclerView没有给我们提供像ListView里面一样的监听点击事件,所以我们需要自己去设置
先直接在MyAdapter中设置监听,然后再在MainActivity中使用即可
接着我们怎么在这个抽象方法中实现监听方法的回调呢?
其实直接通过上面MyViewHolder()中的itemView来设置监听去处理
继续第❺步
这里其实就和正常我们设置监听的时候一样的
这样的话,每当我们点击这个itemView的时候,也就是我们每次点击这些item栏目的时候,那么就会触发我们的这个onClick这个方法
在这个onClick方法里面,我们再进行一个判断
回到MainActivity中
run一下
完成
补充:有时候要做横屏滑动可以怎么做?
看一下LinearLayoutManager()源码,里面的参数,
所以这样填
就ok了