RecyclerView
概述
RecyclerView出现已经有一段时间了,大家可以通过导入support-v7对其进行使用。
据官方的介绍,该控件用于在有限的窗口中展示大量数据集,其实这样功能的控件我们并不陌生,例如:ListView、GridView。
那么有了ListView、GridView为什么还需要RecyclerView这样的控件呢?整体上看RecyclerView架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。
你想要控制其显示的方式,请通过布局管理器LayoutManager
你想要控制Item间的间隔(可绘制),请通过ItemDecoration
你想要控制Item增删的动画,请通过ItemAnimator
你想要控制点击、长按事件,请自己写
了解
LayoutManager
ItemDecoration
ItemAnimator
RecyclerView.Adapter
一 使用
使用1:
RecyclerView配合LinearLayoutManager使用!显示ListView效果
目的:了解RecyclerView使用! 了解RecyclerView.Adapter使用! 了解自定义ViewHolder 继承RecyclerView包下的ViewHolder
步骤:
1.初始化控件
2.设置LayoutManager
/*
参数1:上下文对象
参数2:排列方向
参数3:数据是否反向显示
*/
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,true);
recyclerView.setLayoutManager(linearLayoutManager);
3.创建设置Adapter
class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHoler>{
@Override
public MyViewHoler onCreateViewHolder(ViewGroup parent, int viewType)
@Override
public void onBindViewHolder(MyViewHoler holder, int position) {
@Override
public int getItemCount() {
class MyViewHoler extends RecyclerView.ViewHolder{
private TextView textView;
public MyViewHoler(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.activity_recyclerView_item_textId);
4.设置Adapter即可
使用2:
RecyclerView配合GridLayoutManager使用!显示GridView效果
LayoutManager使用 GridLayoutManager
使用3:
RecyclerView配合StaggeredGridLayoutManager使用!显示瀑布流效果
LayoutManager使用 StaggeredGridLayoutManager
注意事项:
使用StaggeredGridLayoutManager显示瀑布流效果!需要在Adapter的onBindViewHolder方法 自己制定控件的宽和高
二 RecyclerView点击事件
RecyclerView自身不能相ListView和GridView一样 有Item点击事件!需要自己手动添加点击事件!一下就是添加点击事件的流程!
1.onBindViewHolder方法中给控件设置监听事件!
2.使用Adapter对应的Activity传递监听事件
传递方法:1.Adapter的构造方法传递! 必须实现
2.通过set方法传递!比较灵活,可以根绝自行调用决定!
注意:设置控件的单机事件和长按事件是有冲突的!如果长按事件返回值false 那么也会触发单击事件!如果返回ture那么!不会触发单击事件!
三 RecyclerView 配合CardView使用
CardView特殊属性
这个FrameLayout特殊点就是有rounded corner(圆角)和shadow(阴影),这个就是它的特殊之处,回首往日,我们需要自定义shape文件进行实现圆角和阴影的设计,现在google的大牛已经把它设计为CardView的属性供我们设置进行使用。下面我们看看CardView新增了哪些属性:
<resources>
<declare-styleable name="CardView">
<!-- Background color for CardView. -->
<!-- 背景色 -->
<attr name="cardBackgroundColor" format="color" />
<!-- Corner radius for CardView. -->
<!-- 边缘弧度数 -->
<attr name="cardCornerRadius" format="dimension" />
<!-- Elevation for CardView. -->
<!-- 高度 -->
<attr name="cardElevation" format="dimension" />
<!-- Maximum Elevation for CardView. -->
<!-- 最大高度 -->
<attr name="cardMaxElevation" format="dimension" />
<!-- Add padding in API v21+ as well to have the same measurements with previous versions. -->
<!-- 设置内边距,v21+的版本和之前的版本仍旧具有一样的计算方式 -->
<attr name="cardUseCompatPadding" format="boolean" />
<!-- Add padding to CardView on v20 and before to prevent intersections between the Card content and rounded corners. -->
<!-- 在v20和之前的版本中添加内边距,这个属性是为了防止卡片内容和边角的重叠 -->
<attr name="cardPreventCornerOverlap" format="boolean" />
<!-- 下面是卡片边界距离内部的距离-->
<!-- Inner padding between the edges of the Card and children of the CardView. -->
<attr name="contentPadding" format="dimension" />
<!-- Inner padding between the left edge of the Card and children of the CardView. -->
<attr name="contentPaddingLeft" format="dimension" />
<!-- Inner padding between the right edge of the Card and children of the CardView. -->
<attr name="contentPaddingRight" format="dimension" />
<!-- Inner padding between the top edge of the Card and children of the CardView. -->
<attr name="contentPaddingTop" format="dimension" />
<!-- Inner padding between the bottom edge of the Card and children of the CardView. -->
<attr name="contentPaddingBottom" format="dimension" />
</declare-styleable>
</resources>
CardView5.0手机不能直接使用 需要在外层嵌套一层布局 添加Margin属性
或者使用cardUseCompatPadding = true
四 RecyclerView多套布局显示
@Override
public int getItemViewType(int position) {
int type = position%2;
return type;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerView.ViewHolder holder=null;
LayoutInflater from = LayoutInflater.from(context);
if (viewType == 0){
View view = from.inflate(R.layout.item_layout_one, parent, false);
holder= new OneViewHolder(view);
}else if (viewType == 1){
View view = from.inflate(R.layout.item_layout_two, parent, false);
holder = new TwoViewHolder(view);
}
return holder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
int itemViewType = getItemViewType(position);
switch (itemViewType) {
case 0:
OneViewHolder oneViewHolder = (OneViewHolder) holder;
oneViewHolder.textView.setText("类型是0的数据"+data.get(position));
break;
case 1:
TwoViewHolder twoViewHolder = (TwoViewHolder) holder;
twoViewHolder.textView.setText("类型是1的数据"+data.get(position));
break;
}
五 RecyclerView下拉刷新上拉加载更多
RecyclerView下拉刷新 需要配个SwipRefreshLayout进行
SwipRefreshLayout常用属性和方法
1、setOnRefreshListener(SwipeRefreshLayout.OnRefreshListener listener):设置手势滑动监听器。
2、setProgressBackgroundColor(int colorRes):设置进度圈的背景色。
3、setColorSchemeResources(int… colorResIds):设置进度动画的颜色。
4、setRefreshing(Boolean refreshing):设置组件的刷洗状态。
5、setSize(int size):设置进度圈的大小,只有两个值:DEFAULT、LARGE
6. setProgressViewOffset() 设置swipRefreshLayout小圆圈的偏移量