资料
概述
RecyclerView 是一个强大的滑动组件,与经典的ListView 相比,同样拥有item 回收复用的功能,这一点从它的名字RecyclerView 即回收View 也可以看出。
RecycleView 最开始定义在support-v4 包里,后来合并到support-v7 包里,但是support-v7 包最后一个版本是version 28(android Pie),如果compileSdkVersion 比28更高的就请用androidx libraries,它是Google 替代support 包的方案。
基本用法
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
LinearLayoutManager layoutManager = new LinearLayoutManager(this );
//设置布局管理器
recyclerView.setLayoutManager(layoutManager);
//设置为垂直布局,这也是默认的
layoutManager.setOrientation(OrientationHelper. VERTICAL);
//设置Adapter
recyclerView.setAdapter(recycleAdapter);
//设置分隔线
recyclerView.addItemDecoration( new DividerGridItemDecoration(this ));
//设置增加或删除条目的动画
recyclerView.setItemAnimator( new DefaultItemAnimator());
adapter适配器
编码流程:
- 创建ViewHolder;
- 创建RecycleView.Adapter;
- 实现RecycleView.Adapter 的三个抽象方法;
RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType)
这个方法的作用是创建Item 的View ,并将View全部都封装到ViewHolder 里面,然后返回ViewHolder。
注意这边View的创建需要用如下方式:
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_1, parent, false);
这边的viewType 可以配合重写的int getItemViewType(int position) 方法,通过重写getItemViewType 返回指定的值用于加载不同的样式的Item 加载到RecycleView 中去。
void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position)
这个方法的作用是给封装到ViewHolder里面的View,绑定数据。
int getItemCount()
这个方法的作用是确定有多少条目。
Layout Manager 布局管理器
这个的作用就是控制RecycyleView 最终展示出多样的布局方式,比如垂直布局,水平布局,网格布局和其他自定义布局。
Layout Manager不止负责RecycleView 的布局,还负责Item 的获取和回收。
RecycleView 提供了三种布局管理器:
- LinerLayoutManager 以垂直或者水平列表方式展示Item;
- GridLayoutManager 以网格方式展示Item;
- StaggeredGridLayoutManager 以瀑布流方式展示Item;
控制RecycleView的滑动效果是自定义Layout Manager而不是RecycleView。
Layout Manager可以自定义的方法有:
canScrollHorizontally();//能否横向滚动
canScrollVertically();//能否纵向滚动
scrollToPosition(int position);//滚动到指定位置
setOrientation(int orientation);//设置滚动的方向
getOrientation();//获取滚动方向
findViewByPosition(int position);//获取指定位置的Item View
findFirstCompletelyVisibleItemPosition();//获取第一个完全可见的Item位置
findFirstVisibleItemPosition();//获取第一个可见Item的位置
findLastCompletelyVisibleItemPosition();//获取最后一个完全可见的Item位置
findLastVisibleItemPosition();//获取最后一个可见Item的位置