RecyclerView的简单使用
来源:互联网 发布:2017格里芬体测数据 编辑:程序博客网 时间:2024/05/29 10:49
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中:
效果:
- RecyclerView的简单使用
- RecyclerView 的简单使用
- recyclerview的简单使用
- Recyclerview的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView的简单使用
- RecyclerView 的简单使用
- Recyclerview的简单使用
- RecyclerView的简单使用
- 【Ex.】给定s1 = AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.
- Linux环境下搭建jenkins平台
- Zen Coding快速编写HTML代码
- filter过滤器,处理登录session长时失效问题
- 图像识别之卷积讲解
- RecyclerView的简单使用
- HDU1205 吃糖果
- 小米推送常见问题
- 天易47----Springmvc注解方式实现aop配置简单示例
- mysql 向表中插入随机数
- 多文件及单文件上传
- HDU6053 TrickGCD【数学】
- 在eclipse中使用maven创建springMVC项目
- software list