RecyclerView的简单使用
RecyclerView的使用
优点(代码稍显复杂,但是扩展性极高):
1. RecyclerView封装了viewholder的回收复用;
2. RecyclerView可以通过设置LayoutManager的实例使RecyclerView显示出不同的风格;
3. RecyclerView可以通过ItemDecoration的子类绘制出千变万化的分隔效果;
4. RecyclerView可以通过ItemAnimator的子类实现不同的动画效果。
使用RecyclerView能实现的效果:ListView、横向ListView、GridView、横向GridView、瀑布流。
一、导包
eclipse:复制自己电脑sdk\extras\android\support\v7\recyclerview\libs下的android-support-v7-recyclerview.jar到项目的libs文件夹下。
AndroidStudio:compile ‘com.android.support:recyclerview-v7:25.3.1’(注意跟module的compileSdkVersion版本一致)
二、简单使用
2.1 xml
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent" />
2.2 Adapter
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.tiddlerliu.oktest.R;
import java.util.List;
public class CusSimpleAdapter extends RecyclerView.Adapter<CusSimpleAdapter.CusViewHolder>{
private LayoutInflater mLayoutInflater;
private Context mContext;
private List<String> mDatas;
public CusSimpleAdapter(Context context, List<String> datas){
mContext = context;
mDatas = datas;
mLayoutInflater = LayoutInflater.from(context);
}
@Override
public CusViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//创建ViewHolder
View view= mLayoutInflater.inflate(R.layout.item_recycler_list1,parent,false);
CusViewHolder cusViewHolder = new CusViewHolder(view);
return cusViewHolder;
}
@Override
public void onBindViewHolder(CusViewHolder holder, int position) {
//通过ViewHolder设置值
holder.textView.setText(mDatas.get(position));
}
@Override
public int getItemCount() {
return mDatas.size();
}
/** ViewHolder初始化 */
class CusViewHolder extends RecyclerView.ViewHolder{
TextView textView;
public CusViewHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.item_recycler_list1_tv);
}
}
}
2.3 Activity中的设置
2.3.1 垂直ListView效果
mAdapter = new CusSimpleAdapter(mContext, mDatas);//mDatas为数据源
mRvRecycler.setAdapter(mAdapter);
//设置RecyclerView的布局--参数含义:{context,水平or垂直,是否倒叙显示}默认为垂直方向
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext,
LinearLayoutManager.VERTICAL, false);
mRvRecycler.setLayoutManager(linearLayoutManager);
2.3.2 水平ListView效果
修改LayoutManager参数:
2.3.3 GridView效果
2.3.4 水平GridView效果
2.3.5 瀑布流效果
为了模拟瀑布流效果,item的高度使用随机数生成。ps:item的布局文件高度不能写成固定高度。
在Adapter里添加如下代码:
在Activity中使用StaggeredGridLayoutManager:
三、分隔线
3.1 简单实现
如果只是简单的显示背景色,可以给Item的layout添加layout_margin属性(效果为2.3.5瀑布流效果)。
3.2 ItemDecoration的子类实现
以绘制垂直linear分隔线为例,绘制分隔线即绘制item之间的绿色长方形区域,item(黄色)与分隔线(绿色)之间的区域是ItemLayout文件的layout_marginBottom属性(蓝色)。以下为垂直风格示意图:
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.RecyclerView;
import android.view.View;
/**
* 绘制RecyclerView的Linear风格divider
*/
public class RecLinearItemDecoration extends RecyclerView.ItemDecoration {
//使用系统默认分隔线的Drawable资源ID
private static final int[] ATTRS = {android.R.attr.listDivider};
//分隔线
private Drawable mDivider;
//构造方法
public RecLinearItemDecoration(Context context) {
//获取TypedArray对象
TypedArray typedArray = context.obtainStyledAttributes(ATTRS);
//获取系统提供的分隔线Drawable对象
mDivider = typedArray.getDrawable(0);
typedArray.recycle();//回收资源
}
//绘制所有item的分隔线
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
//获取item距离左边缘的距离(X1坐标)
int left = parent.getPaddingLeft();
//获取item距离右边缘的距离(X2坐标)
int right = parent.getWidth() - parent.getPaddingRight();
//获取item的总数
int childCount = parent.getChildCount();
//开始所有item之间的分隔线
for (int i = 0; i < childCount; i++) {
//获取当前的item
View childView = parent.getChildAt(i);
//获取当前item的布局参数信息
RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) childView.getLayoutParams();
//计算分隔线上侧y坐标(Y1坐标)
int top = childView.getBottom() + params.bottomMargin;
//计算分隔线下侧y坐标(Y2坐标)
int bottom = top + mDivider.getIntrinsicHeight();//Y1 + 分隔线高度
//设置分隔线绘制位置
mDivider.setBounds(left, top, right, bottom);
//开始绘制
mDivider.draw(c);//将mDivider绘制到画布c上
}
}
//设置item偏移量(绘制divider的间隙),默认情况下不不绘制divider
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
//向下偏移量为分隔线高度
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
}
}
3.3 定制分隔线样式
上述子类中使用系统默认分隔线的Drawable资源ID,如果想改变分隔线颜色、宽度,可以使用Theme Style设置。
3.3.1 在drawble文件夹下创建资源
文件位置://res/drawable/item_recycler_divider
3.3.2 在style文件中应用
效果:
GitHub上的开源库地址,封装了各种RecyclerView分隔线。点击跳转
四、item的添加删除动画
首先,在Adapter里添加方法。调用相应方法才会有动画效果。
对RecylerView对象设置动画:
调用Adapter里的添加删除方法:
效果:
GitHub上的开源库地址,封装了各种RecyclerView动画。点击跳转
五、RecyclerView添加onClick事件
RecyclerView对它的item并没有提供OnClickListener()和OnItemLongClickListener()回调方法。
简单示例:在Adapter中增加事件接口,在Activity中调用。
Adapter:
Activity中:
效果:
上一篇: 冒泡排序(Bubble Sort)
下一篇: recyclerview的简单使用
推荐阅读
-
php使用fopen创建utf8编码文件的方法
-
Linux系统中的ipcs命令使用详解
-
ASP.NET jQuery 实例12 通过使用jQuery validation插件简单实现用户注册页面验证功能_jquery
-
使用wdcp3建立的FTP 部分可以登录 部分不能登录
-
Windows下Qt与Tesseract4.1的使用
-
非常不错的功能强大代码简单的管理菜单美化版_javascript技巧
-
单目相机标定: 一个全自动化的使用opencv的标定程序
-
Tesseract应用:ScrollView.jar以及ViewDebugging的使用及相关问题
-
使用CSS3实现多列布局与多背景的技巧
-
最简单的nginx+ftp搭建图片服务器(Windows Server服务器环境下和本机都可以用)