目录:

1.基本使用

2.ItemDecoration   Item分割线

3.LayoutManager  

4.ItemAnimator   Item动画

5.Click and LongClick  Item点击事件

--------------------

1.基本使用

RecyclerView的使用中最重要的是Adapter,Adapter中最重要的是ViewHolder。先看最简单的RecyclerView的Adapter实现:

class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder>{@Overridepublic MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){MyViewHolder holder = new MyViewHolder(LayoutInflater.from(HomeActivity.this).inflate(R.layout.item_home, parent,false));return holder;}@Overridepublic void onBindViewHolder(MyViewHolder holder, int position){holder.tv.setText(mDatas.get(position));}@Overridepublic int getItemCount(){return mDatas.size();}class MyViewHolder extends ViewHolder{TextView tv;public MyViewHolder(View view){super(view);tv = (TextView) view.findViewById(R.id.id_num);}}}

RecyclerView的基本使用 代码:

mRecyclerView = findView(R.id.id_recyclerview);
//设置布局管理器
mRecyclerView.setLayoutManager(layout);
//设置adapter
mRecyclerView.setAdapter(adapter)
//设置Item增加、移除动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
//添加分割线
mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.HORIZONTAL_LIST));

主要通过上面代码,即可实现和ListView类似的效果

2.ItemDecoration   Item分割线

我们可以通过该方法添加分割线:

mRecyclerView.addItemDecoration() 

  2.1 ListView型分割线 实现类

  

package com.devilwwj.myapplication_recyclerview;/** Copyright (C) 2014 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* limitations under the License.*/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.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.State;
import android.util.Log;
import android.view.View;/*** This class is from the v7 samples of the Android SDK. It's not by me!* <p/>* See the license above for details.*/
public class DividerItemDecoration extends RecyclerView.ItemDecoration {private static final int[] ATTRS = new int[]{android.R.attr.listDivider};public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;private Drawable mDivider;private int mOrientation;public DividerItemDecoration(Context context, int orientation) {final TypedArray a = context.obtainStyledAttributes(ATTRS);mDivider = a.getDrawable(0);a.recycle();setOrientation(orientation);}public void setOrientation(int orientation) {if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {throw new IllegalArgumentException("invalid orientation");}mOrientation = orientation;}@Overridepublic void onDraw(Canvas c, RecyclerView parent) {Log.v("recyclerview - itemdecoration", "onDraw()");if (mOrientation == VERTICAL_LIST) {drawVertical(c, parent);} else {drawHorizontal(c, parent);}}public void drawVertical(Canvas c, RecyclerView parent) {final int left = parent.getPaddingLeft();final int right = parent.getWidth() - parent.getPaddingRight();final int childCount = parent.getChildCount();for (int i = 0; i < childCount; i++) {final View child = parent.getChildAt(i);android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext());final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();final int top = child.getBottom() + params.bottomMargin;final int bottom = top + mDivider.getIntrinsicHeight();mDivider.setBounds(left, top, right, bottom);mDivider.draw(c);}}public void drawHorizontal(Canvas c, RecyclerView parent) {final int top = parent.getPaddingTop();final int bottom = parent.getHeight() - parent.getPaddingBottom();final int childCount = parent.getChildCount();for (int i = 0; i < childCount; i++) {final View child = parent.getChildAt(i);final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();final int left = child.getRight() + params.rightMargin;final int right = left + mDivider.getIntrinsicHeight();mDivider.setBounds(left, top, right, bottom);mDivider.draw(c);}}@Overridepublic void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {if (mOrientation == VERTICAL_LIST) {outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());} else {outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);}}
}

  2.2 GridView型分割线 实现类

  

package com.devilwwj.myapplication_recyclerview;import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.LayoutManager;
import android.support.v7.widget.RecyclerView.State;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;public class DividerGridItemDecoration extends RecyclerView.ItemDecoration {private static final int[] ATTRS = new int[]{android.R.attr.listDivider};private Drawable mDivider;private Paint mPaint;private int mDividerHeight = 1;public DividerGridItemDecoration(Context context) {final TypedArray a = context.obtainStyledAttributes(ATTRS);mDivider = a.getDrawable(0);a.recycle();}/*** 自定义分割线** @param context* @param drawableId 分割线图片*/public DividerGridItemDecoration(Context context, int drawableId) {mDivider = ContextCompat.getDrawable(context, drawableId);mDividerHeight = mDivider.getIntrinsicHeight();}/*** 自定义分割线** @param context* @param dividerHeight 分割线高度* @param dividerColor  分割线颜色*/public DividerGridItemDecoration(Context context, int dividerHeight, int dividerColor) {mDividerHeight = dividerHeight;mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mPaint.setColor(dividerColor);mPaint.setStyle(Paint.Style.FILL);}@Overridepublic void onDraw(Canvas c, RecyclerView parent, State state) {drawHorizontal(c, parent);drawVertical(c, parent);}private int getSpanCount(RecyclerView parent) {// 列数int spanCount = -1;LayoutManager layoutManager = parent.getLayoutManager();if (layoutManager instanceof GridLayoutManager) {spanCount = ((GridLayoutManager) layoutManager).getSpanCount();} else if (layoutManager instanceof StaggeredGridLayoutManager) {spanCount = ((StaggeredGridLayoutManager) layoutManager).getSpanCount();}return spanCount;}// 绘制水平线public void drawHorizontal(Canvas c, RecyclerView parent) {int childCount = parent.getChildCount();for (int i = 0; i < childCount; i++) {final View child = parent.getChildAt(i);final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();final int left = child.getLeft() - params.leftMargin;final int right = child.getRight() + params.rightMargin + mDividerHeight;final int top = child.getBottom() + params.bottomMargin;final int bottom = top + mDividerHeight;if (mDivider != null) {mDivider.setBounds(left, top, right, bottom);mDivider.draw(c);}if (mPaint != null) {c.drawRect(left, top, right, bottom, mPaint);}}}// 绘制垂直线public void drawVertical(Canvas c, RecyclerView parent) {final int childCount = parent.getChildCount();for (int i = 0; i < childCount; i++) {final View child = parent.getChildAt(i);final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();final int top = child.getTop() - params.topMargin;final int bottom = child.getBottom() + params.bottomMargin;final int left = child.getRight() + params.rightMargin;final int right = left + mDividerHeight;if (mDivider != null) {mDivider.setBounds(left, top, right, bottom);mDivider.draw(c);}if (mPaint != null) {c.drawRect(left, top, right, bottom, mPaint);}}}// 判断是否是最后一列private boolean isLastColum(RecyclerView parent, int pos, int spanCount, int childCount) {LayoutManager layoutManager = parent.getLayoutManager();if (layoutManager instanceof GridLayoutManager) {if ((pos + 1) % spanCount == 0)// 如果是最后一列,则不需要绘制右边
            {return true;}} else if (layoutManager instanceof StaggeredGridLayoutManager) {int orientation = ((StaggeredGridLayoutManager) layoutManager).getOrientation();if (orientation == StaggeredGridLayoutManager.VERTICAL) {if ((pos + 1) % spanCount == 0) {// 如果是最后一列,则不需要绘制右边return true;}} else {childCount = childCount - childCount % spanCount;if (pos >= childCount)// 如果是最后一列,则不需要绘制右边return true;}}return false;}// 判断是否是最后一行private boolean isLastRaw(RecyclerView parent, int pos, int spanCount, int childCount) {LayoutManager layoutManager = parent.getLayoutManager();if (layoutManager instanceof GridLayoutManager) {childCount = childCount - childCount % spanCount;if (pos >= childCount)// 如果是最后一行,则不需要绘制底部return true;} else if (layoutManager instanceof StaggeredGridLayoutManager) {int orientation = ((StaggeredGridLayoutManager) layoutManager).getOrientation();// StaggeredGridLayoutManager 且纵向滚动if (orientation == StaggeredGridLayoutManager.VERTICAL) {childCount = childCount - childCount % spanCount;// 如果是最后一行,则不需要绘制底部if (pos >= childCount)return true;} else// StaggeredGridLayoutManager 且横向滚动
            {// 如果是最后一行,则不需要绘制底部if ((pos + 1) % spanCount == 0) {return true;}}}return false;}@Overridepublic void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {int spanCount = getSpanCount(parent);int childCount = parent.getAdapter().getItemCount();if (isLastRaw(parent, itemPosition, spanCount, childCount))// 如果是最后一行,则不需要绘制底部
        {outRect.set(0, 0, mDividerHeight, 0);} else if (isLastColum(parent, itemPosition, spanCount, childCount))// 如果是最后一列,则不需要绘制右边
        {outRect.set(0, 0, 0, mDividerHeight);} else {outRect.set(0, 0, mDividerHeight, mDividerHeight);}}
}

3.LayoutManager

  3.1 LinearLayoutManager 线性布局管理器

  3.2 GridLayoutManager 网格布局管理器

  3.3 StaggeredGridLayoutManager 网格布局管理器

4.ItemAnimator   Item动画

// 设置item动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());

注意,这里更新数据集不是用adapter.notifyDataSetChanged()而是 
notifyItemInserted(position)notifyItemRemoved(position) 
否则没有动画效果。 
为上述adapter中添加了两个方法:

public void addData(int position) {mDatas.add(position, "Insert One");notifyItemInserted(position);
}public void removeData(int position) {mDatas.remove(position);notifyItemRemoved(position);
}

5.Click and LongClick  Item点击事件

adapter中自己去提供回调

class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder>
{//...public interface OnItemClickLitener{void onItemClick(View view, int position);void onItemLongClick(View view , int position);}private OnItemClickLitener mOnItemClickLitener;public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener){this.mOnItemClickLitener = mOnItemClickLitener;}@Overridepublic void onBindViewHolder(final MyViewHolder holder, final int position){holder.tv.setText(mDatas.get(position));// 如果设置了回调,则设置点击事件if (mOnItemClickLitener != null){holder.itemView.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v){int pos = holder.getLayoutPosition();mOnItemClickLitener.onItemClick(holder.itemView, pos);}});holder.itemView.setOnLongClickListener(new OnLongClickListener(){@Overridepublic boolean onLongClick(View v){int pos = holder.getLayoutPosition();mOnItemClickLitener.onItemLongClick(holder.itemView, pos);return false;}});}}
//...
}

Activity中去设置监听:

mAdapter.setOnItemClickLitener(new OnItemClickLitener(){@Overridepublic void onItemClick(View view, int position){Toast.makeText(HomeActivity.this, position + " click",Toast.LENGTH_SHORT).show();}@Overridepublic void onItemLongClick(View view, int position){Toast.makeText(HomeActivity.this, position + " long click",Toast.LENGTH_SHORT).show();mAdapter.removeData(position);}});

源码:http://pan.baidu.com/s/1slRiugX  (提取码:yrfu)

参考:http://blog.csdn.net/lmj623565791/article/details/45059587

转载于:https://www.cnblogs.com/blackmonkey/p/6582993.html

RecyclerView 初体验相关推荐

  1. Android RecyclerView初体验

    很早之前就听说过RecyclerView这个组件了,但一直很忙没时间学习.趁着周末,就花了一天时间来学习RecyclerView. 准备工作 在Android Studio里新建一个Android项目 ...

  2. Jetpack Compose 初体验(上),flutter人脸识别系统

    fun VerticalText() { Column( modifier = Modifier.padding(16.dp) ) { Text("Hello World!") T ...

  3. Android客户端——寒假实习面经-实习初体验

    Android客户端--寒假实习面经-实习初体验 一.絮絮叨叨的一些话 好久没有写博客了,前段时间一直在忙实习的事,耽搁了一阵子,现在忙的差不多了,所以打算在实习期间抽些,继续写写博客,为明年的春招和 ...

  4. 苹果电脑安装python3密码_mac系统安装Python3初体验

    前沿 对于iOS开发不要随便拆卸系统自带的Python,因为有很多 library 还是使用 Python2.7. 1 安装Xcode 1.1 App Store 搜索Xcode 并安装 1.2 安装 ...

  5. MapReduce编程初体验

    需求:在给定的文本文件中统计输出每一个单词出现的总次数 第一步: 准备一个aaa.txt文本文档 第二步: 在文本文档中随便写入一些测试数据,这里我写入的是 hello,world,hadoop he ...

  6. 小程序 缩放_缩放流星应用程序的初体验

    小程序 缩放 by Elie Steinbock 埃莉·斯坦博克(Elie Steinbock) 缩放流星应用程序的初体验 (First Experiences Scaling a Meteor Ap ...

  7. wxWidgets刚開始学习的人导引(3)——wxWidgets应用程序初体验

    wxWidgets刚開始学习的人导引全文件夹   PDF版及附件下载 1 前言 2 下载.安装wxWidgets 3 wxWidgets应用程序初体验 4 wxWidgets学习资料及利用方法指导 5 ...

  8. 用鸿蒙跑了个 “hello world”!鸿蒙开发初体验

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源 | https://my.oschina.net/u ...

  9. Windows Embedded Standard开发初体验(二)

    支持Silverlight的Windows Embedded Standard 好了,完成安装之后,我们就可以来做Windows Embedded Standard的第一个操作系统镜像了.在开始菜单中 ...

最新文章

  1. 国内四大搜索站长工具
  2. 【Windows】字符串处理
  3. 在cds学到的(非技术)
  4. 算法设计与分析——分支限界法——n皇后问题
  5. 使用Java 8和Lambda简化ReadWriteLock
  6. 《C++ Primer 第五版》第二章(1-4小节)------基本内置类型,初始化和赋值及声明和定义,指针和引用,const和constexpr
  7. poj 2507Crossed ladders 计算几何
  8. 内网穿透工具_utools让你3步搭建一个内网穿透工具
  9. Linux操作系统下SSH默认22端口修改方法
  10. 深度学习2.0-7.tensorflow的高阶操作之数据统计
  11. css3 圣诞红包雨效果
  12. 新买的联想笔记本计算机选项,联想笔记本电脑进入BIOS界面,以选择将硬盘设置为首次启动的选项...
  13. 为什么别人可以打开的网站,你却打不开?原因找到了 ,HTTP ERROR 404
  14. 市场调研报告-工业固体废物管理市场现状及未来发展趋势
  15. CF1428 G1,G2 . Lucky Numbers题解
  16. 一、如何完全卸载Anaconda(如何下载Anaconda-Clean package)
  17. WebSocket的那些事(3-STOMP实操篇)
  18. 好文章要收藏_漫谈IT毕业生职业规划
  19. 知名硅谷黑客当街被刺身亡!年仅43岁,马斯克都怒了
  20. woff字体文件转xml介绍

热门文章

  1. 实现74HC/HCT194的双向移位寄存器功能
  2. 超级群、群组、聊天室,IM 产品的场景化「特异功能」
  3. 【2022年4月1日 经验】Microsoft AZ-900 微软认证 网上考试 攻略
  4. 卸载ncurses_Linux下程序库Ncurses显示中文乱码的解决方法
  5. 千万不要养大型犬,多么痛的领悟
  6. 超美文艺产品介绍小清新PPT模板
  7. 迷你气象站(雨量计,风速,风向)
  8. 强化学习和 Q-Learning
  9. unit8_t, unit16_t, unit32_t, unit64_t
  10. Netty学习09-粘包和分包及FrameDecoder源码解析