1.添加.jar包

File -> Project-Structure -> 左下角 “app” -> Dependencies -> 右上角“+” -> File dependency -> 选择“com.android.support:recyclerview-v7:23.1.0”

然后在“build-gradle”里面看到“compile ’com.android.support:recyclerview-v7:23.1.0‘”,如果不行,直接复制这句话到这里

MainActivity.java

  1. public class MainActivity extends AppCompatActivity {
  2. private RecyclerView mRecyclerView;
  3. private List<String> mData;
  4. private MyAdapter mAdapter;
  5.  
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10.  
  11. initData();
  12. initView();
  13.  
  14. mAdapter = new MyAdapter(this,mData);
  15. mRecyclerView.setAdapter(mAdapter);
  16.  
  17. //AS自带的动画效果
  18. mRecyclerView.setItemAnimator(new DefaultItemAnimator());
  19.  
  20. //设置RecyclerView的布局管理
  21. LinearLayoutManager manager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
  22. mRecyclerView.setLayoutManager(manager);
  23.  
  24. //设置RecyclerView的Item间分割线
  25. //直接在item.xml文件中设置android:layout_margin="6dp"取代这句话
  26. mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL_LIST));
  27.  
  28. mAdapter.onViewItemClickListener(new MyAdapter.onViewItemClick() {
  29. @Override
  30. public void onItemClick(View view, int position) {
  31. Toast.makeText(MainActivity.this,"Click : "+position,Toast.LENGTH_SHORT).show();
  32. }
  33.  
  34. @Override
  35. public void onItemLongClick(View view, int position) {
  36. Toast.makeText(MainActivity.this,"Long Click : "+position,Toast.LENGTH_SHORT).show();
  37. mAdapter.itemRemove(position);
  38. }
  39. });
  40. }
  41.  
  42. private void initData(){
  43.  
  44. mData = new ArrayList<String>();
  45. for (int i = 'A';i <= 'z';i++) {
  46. mData.add(" "+(char)i);
  47. }
  48. }
  49.  
  50. private void initView() {
  51. mRecyclerView = (RecyclerView) findViewById(R.id.rv_recycler);
  52. }
  53.  
  54. @Override
  55. public boolean onCreateOptionsMenu(Menu menu) {
  56. getMenuInflater().inflate(R.menu.menu, menu);
  57. return super.onCreateOptionsMenu(menu);
  58. }
  59.  
  60. @Override
  61. public boolean onOptionsItemSelected(MenuItem item) {
  62. switch (item.getItemId()) {
  63. case R.id.action_add:
  64. mAdapter.itemAdd(1);
  65. break;
  66. case R.id.action_delete:
  67. mAdapter.itemRemove(1);
  68. break;
  69.  
  70. case R.id.action_diary:
  71. mRecyclerView.setLayoutManager(new GridLayoutManager(this,3));
  72. break;
  73. case R.id.action_catalog:
  74. mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
  75. break;
  76. case R.id.action_more:
  77. mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));
  78. break;
  79. case R.id.action_demo:
  80. Intent intent = new Intent(MainActivity.this,StraggedGridViewActivity.class);
  81. startActivity(intent);
  82. }
  83. return super.onOptionsItemSelected(item);
  84. }
  85. }

MyAdapter.java

  1. public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
  2. private List<String> mData;
  3. private LayoutInflater mInflater;
  4. private Context mContext;
  5.  
  6. private onViewItemClick onViewItemClickListener;
  7.  
  8. public void onViewItemClickListener(onViewItemClick listener){
  9. this.onViewItemClickListener = listener;
  10. }
  11.  
  12. public MyAdapter(Context context,List<String> data) {
  13. this.mContext = context;
  14. this.mData = data;
  15. this.mInflater = LayoutInflater.from(context);
  16. }
  17.  
  18. //创建ViewHolder
  19. @Override
  20. public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  21. View view = mInflater.inflate(R.layout.item,parent,false);
  22. MyViewHolder viewHolder = new MyViewHolder(view);
  23.  
  24. return viewHolder;
  25. }
  26.  
  27. //绑定ViewHolder
  28. //final是自动添加上去的
  29. @Override
  30. public void onBindViewHolder(final MyViewHolder holder, final int position) {
  31. holder.tv.setText(mData.get(position));
  32.  
  33. /*if (onViewItemClickListener != null) {
  34. holder.itemView.setOnClickListener(new View.OnClickListener() {
  35. @Override
  36. public void onClick(View v) {
  37. onViewItemClickListener.onItemClick(holder.itemView,position);
  38. }
  39. });
  40. }*/
  41.  
  42. holder.itemView.setOnClickListener(new View.OnClickListener() {
  43. @Override
  44. public void onClick(View v) {
  45. //直接position不会刷新位置信息
  46. int layoutPosition = holder.getLayoutPosition();
  47. //onViewItemClickListener.onItemClick(holder.itemView,position);
  48. onViewItemClickListener.onItemClick(holder.itemView,layoutPosition);
  49. }
  50. });
  51.  
  52. holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
  53. @Override
  54. public boolean onLongClick(View v) {
  55. int layoutPosition = holder.getLayoutPosition();
  56. onViewItemClickListener.onItemLongClick(holder.itemView,layoutPosition);
  57. return false;
  58. }
  59. });
  60. }
  61.  
  62. @Override
  63. public int getItemCount() {
  64. //return 0;
  65. return mData.size();
  66. }
  67.  
  68. //自定义添加item方法
  69. public void itemAdd(int position) {
  70. //不是notifyItemChanged(),这是把position位置的给取代了
  71. mData.add(position, "SSS");
  72. notifyItemInserted(position);
  73. //notifyItemChanged(position);
  74. }
  75.  
  76. //自定义删除item方法
  77. public void itemRemove(int position) {
  78. mData.remove(position);
  79. notifyItemRemoved(position);
  80. }
  81.  
  82. //监听点击事件的接口
  83. public interface onViewItemClick {
  84. void onItemClick(View view, int position);
  85. void onItemLongClick(View view, int position);
  86. }
  87.  
  88. }
  89.  
  90. //MyViewHolder拥有所有item.xml的控件
  91. class MyViewHolder extends RecyclerView.ViewHolder {
  92. //tv不能是private,因为MyAdapter类中的onBindViewHolder()要调用
  93. TextView tv;
  94.  
  95. public MyViewHolder(View itemView) {
  96. super(itemView);
  97. tv = (TextView) itemView.findViewById(R.id.tv_text);
  98. }
  99. }

StraggedGridViewActivity.java

  1. public class StraggedGridViewActivity extends AppCompatActivity {
  2. private RecyclerView mRecyclerView;
  3. private List<String> mData;
  4. private StraggedGridViewAdapter mAdapter;
  5.  
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_stragged_grid_view);
  10.  
  11. initData();
  12. initView();
  13.  
  14. mAdapter = new StraggedGridViewAdapter(this,mData);
  15. mRecyclerView.setAdapter(mAdapter);
  16.  
  17. mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
  18. }
  19.  
  20. private void initData(){
  21. mData = new ArrayList<String>();
  22. for (int i = 'A';i <= 'z';i++) {
  23. mData.add(" "+(char)i);
  24. }
  25. }
  26.  
  27. private void initView() {
  28. mRecyclerView = (RecyclerView) findViewById(R.id.rv_recycler);
  29. }
  30. }

StraggedGridViewAdapter.java

  1. public class StraggedGridViewAdapter extends RecyclerView.Adapter<MyViewHolder2> {
  2. private List<String> mData;
  3. private LayoutInflater mInflater;
  4. private Context mContext;
  5.  
  6. private List<Integer> mHeight;
  7.  
  8. public StraggedGridViewAdapter(Context context,List<String> data) {
  9. this.mContext = context;
  10. this.mData = data;
  11. this.mInflater = LayoutInflater.from(context);
  12.  
  13. mHeight = new ArrayList<Integer>();
  14. for (int i = 0;i <mData.size();i++) {
  15. mHeight.add((int) (100+Math.random()*300));
  16. }
  17. }
  18.  
  19. //创建ViewHolder
  20. @Override
  21. public MyViewHolder2 onCreateViewHolder(ViewGroup parent, int viewType) {
  22. View view = mInflater.inflate(R.layout.item,parent,false);
  23. MyViewHolder2 viewHolder = new MyViewHolder2(view);
  24.  
  25. return viewHolder;
  26. }
  27.  
  28. //绑定ViewHolder
  29. @Override
  30. public void onBindViewHolder(MyViewHolder2 holder, int position) {
  31. //动态高度的设置
  32. ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
  33. lp.height = mHeight.get(position);
  34. holder.itemView.setLayoutParams(lp);
  35. holder.tv.setText(mData.get(position));
  36. }
  37.  
  38. @Override
  39. public int getItemCount() {
  40. //return 0;
  41. return mData.size();
  42. }
  43. }
  44.  
  45. //MyViewHolder拥有所有item.xml的控件
  46. class MyViewHolder2 extends RecyclerView.ViewHolder {
  47. //tv不能是private,因为MyAdapter类中的onBindViewHolder()要调用
  48. TextView tv;
  49.  
  50. public MyViewHolder2(View itemView) {
  51. super(itemView);
  52. tv = (TextView) itemView.findViewById(R.id.tv_text);
  53. }
  54. }

DividerItemDecoration.java    //这是分割线,可以不要,在divider.xml和styles.xml里面可以取代

  1. public class DividerItemDecoration extends RecyclerView.ItemDecoration
  2. {
  3.  
  4. private static final int[] ATTRS = new int[] { android.R.attr.listDivider };
  5.  
  6. public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
  7.  
  8. public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
  9.  
  10. private Drawable mDivider; //item间间隔图片资源
  11.  
  12. private int mOrientation; //方向:水平,垂直
  13.  
  14. public DividerItemDecoration(Context context, int orientation)
  15. {
  16. final TypedArray a = context.obtainStyledAttributes(ATTRS);
  17. mDivider = a.getDrawable(0);
  18. a.recycle();
  19. setOrientation(orientation);
  20. }
  21.  
  22. public void setOrientation(int orientation)
  23. {
  24. if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST)
  25. {
  26. throw new IllegalArgumentException("invalid orientation");
  27. }
  28. mOrientation = orientation;
  29. }
  30.  
  31. @Override
  32. public void onDraw(Canvas c, RecyclerView parent)
  33. {
  34. //Log.v("recyclerview - itemdecoration", "onDraw()");
  35. if (mOrientation == VERTICAL_LIST) {
  36. drawVertical(c, parent);
  37. } else {
  38. drawHorizontal(c, parent);
  39. }
  40. }
  41.  
  42. public void drawVertical(Canvas c, RecyclerView parent)
  43. {
  44. final int left = parent.getPaddingLeft();
  45. final int right = parent.getWidth() - parent.getPaddingRight();
  46.  
  47. final int childCount = parent.getChildCount();
  48.  
  49. for (int i = 0; i < childCount; i++)
  50. {
  51. final View child = parent.getChildAt(i);
  52. RecyclerView v = new RecyclerView(
  53. parent.getContext());
  54. final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
  55. .getLayoutParams();
  56. final int top = child.getBottom() + params.bottomMargin;
  57. final int bottom = top + mDivider.getIntrinsicHeight();
  58. mDivider.setBounds(left, top, right, bottom);
  59. mDivider.draw(c);
  60. }
  61. }
  62.  
  63. public void drawHorizontal(Canvas c, RecyclerView parent)
  64. {
  65. final int top = parent.getPaddingTop();
  66. final int bottom = parent.getHeight() - parent.getPaddingBottom();
  67.  
  68. final int childCount = parent.getChildCount();
  69. for (int i = 0; i < childCount; i++)
  70. {
  71. final View child = parent.getChildAt(i);
  72. final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
  73. .getLayoutParams();
  74. final int left = child.getRight() + params.rightMargin;
  75. final int right = left + mDivider.getIntrinsicHeight();
  76. mDivider.setBounds(left, top, right, bottom);
  77. mDivider.draw(c);
  78. }
  79. }
  80.  
  81. //提供绘制分割线的间隙
  82. @Override
  83. public void getItemOffsets(Rect outRect, int itemPosition,
  84. RecyclerView parent)
  85. {
  86. if (mOrientation == VERTICAL_LIST)
  87. {
  88. outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
  89. } else
  90. {
  91. outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
  92. }
  93. }
  94. }

main_activity.xml

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. tools:context=".MainActivity">
  6.  
  7. <android.support.v7.widget.RecyclerView
  8. android:id="@+id/rv_recycler"
  9. android:layout_height="match_parent"
  10. android:layout_width="match_parent"/>
  11. </RelativeLayout>

activity_stragged_grid_view.xml

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:paddingLeft="@dimen/activity_horizontal_margin"
  6. android:paddingRight="@dimen/activity_horizontal_margin"
  7. android:paddingTop="@dimen/activity_vertical_margin"
  8. android:paddingBottom="@dimen/activity_vertical_margin"
  9. tools:context="my.com.example.x550v.recyclerviewdemo.StraggedGridViewActivity">
  10.  
  11. <android.support.v7.widget.RecyclerView
  12. android:id="@+id/rv_recycler"
  13. android:layout_height="match_parent"
  14. android:layout_width="match_parent"/>
  15.  
  16. </RelativeLayout>

item.xml

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:background="@drawable/button"
  5. android:layout_marginTop="8dp"
  6. android:layout_marginBottom="8dp"
  7. android:layout_marginRight="5dp"
  8. android:layout_marginLeft="5dp"
  9. android:orientation="vertical">
  10. <TextView
  11. android:id="@+id/tv_text"
  12. android:gravity="center"
  13. android:textColor="#fff"
  14. android:textSize="20sp"
  15. android:layout_gravity="center"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content" />
  18.  
  19. </LinearLayout>

divider.xml

  1. <!--写完后要在styles里面声明-->
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:shape="rectangle">
  4. <size android:height="4dp"/>
  5. <gradient
  6. android:startColor="#000"
  7. android:centerColor="#fff"
  8. android:endColor="#fff"
  9. android:type="linear"/>
  10. </shape>

buttom.xml

  1. <selector
  2. xmlns:android="http://schemas.android.com/apk/res/android">
  3. <item
  4. android:state_pressed="false">
  5. <shape
  6. android:shape="rectangle">
  7. <gradient
  8. android:angle="45"
  9. android:centerX="35%"
  10. android:centerColor="#43D2E8"
  11. android:startColor="#43D2E8"
  12. android:endColor="#000000"
  13. android:type="linear"
  14. />
  15. </shape>
  16. </item>
  17.  
  18. <item
  19. android:state_pressed="true"
  20. >
  21. <shape
  22. android:shape="rectangle">
  23. <gradient
  24. android:angle="45"
  25. android:centerX="35%"
  26. android:centerColor="#B3DDE8"
  27. android:startColor="#43D2E8"
  28. android:endColor="#000000"
  29. android:type="linear"
  30. />
  31. </shape>
  32. </item>
  33.  
  34. </selector>

menu.xml

  1. <menu
  2. xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. tools:context="my.com.example.x550v.recyclerviewdemo.MainActivity">
  6.  
  7. <item
  8. android:id="@+id/action_add"
  9. android:title="Add"
  10. android:icon="@android:drawable/ic_media_play"
  11. app:showAsAction="ifRoom"/>
  12.  
  13. <item
  14. android:id="@+id/action_delete"
  15. android:title="Add"
  16. android:icon="@android:drawable/ic_media_pause"
  17. app:showAsAction="ifRoom"/>
  18.  
  19. <item
  20. android:id="@+id/action_both"
  21. android:title="action"
  22. android:icon="@android:drawable/ic_input_add"
  23. app:showAsAction="ifRoom|collapseActionView">
  24.  
  25. <menu>
  26. <item
  27. android:id="@+id/action_diary"
  28. android:title="GirdView"
  29. android:icon="@android:drawable/ic_menu_save"
  30. app:showAsAction="ifRoom"/>
  31. <item
  32. android:id="@+id/action_catalog"
  33. android:title="LinearView"
  34. android:icon="@android:drawable/ic_menu_sort_by_size"
  35. app:showAsAction="ifRoom"/>
  36. <item
  37. android:id="@+id/action_more"
  38. android:title="StaggeredGridView"
  39. android:icon="@android:drawable/ic_menu_myplaces"
  40. app:showAsAction="ifRoom"/>
  41. <item
  42. android:id="@+id/action_demo"
  43. android:title="StaggeredGridDemoView"
  44. android:icon="@android:drawable/ic_menu_mapmode"
  45. app:showAsAction="ifRoom"/>
  46. </menu>
  47. </item>
  48.  
  49. </menu>

styles.xml

  1. <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
  2. <!-- Customize your theme here. -->
  3. <item name="colorPrimary">@color/colorPrimary</item>
  4. <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
  5. <item name="colorAccent">@color/colorAccent</item>
  6.  
  7. <!--设置分割线-->
  8. <item name="android:listDivider">@drawable/diver</item>
  9.  
  10. </style>

运行效果:

          

      

RecyclerView的使用方法的更多相关文章

  1. recyclerView中的方法

    onCreateViewHolder(); onBindViewHolder(); getItemCount(); recyclerVIew中没有添加头布局和尾布局方法.可以用getItemViewT ...

  2. 更新RecyclerView的好方法

    一般在使用RecyclerView的时候不免要修改RecyclerView的数据,使用notifyDataSetChanged()来刷新界面,但是当数据比较多,而只是修改了一点的数据,或者刷新比较频繁 ...

  3. ListView的基本使用方法和RecyclerView的基本使用方法

    ListView是一种用于列表显示数据内容的控件,它可以通过适配器实现对于数据的列表显示,而RecyclerView是对于ListView优化后的列表数据显示控件. 个人对于List的使用经历多半在新 ...

  4. RecyclerView使用大全

    RecylerView介绍 RecylerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,这一点从它的名字recyler ...

  5. 打造android偷懒神器———RecyclerView的万能适配器

    转载请注明出处谢谢:http://www.cnblogs.com/liushilin/p/5720926.html 很不好意思让大家久等了,本来昨天就应该写这个的,无奈公司昨天任务比较紧,所以没能按时 ...

  6. 自定义RecyclerView.ItemDecoration,实现RecyclerView的分割线效果

    [转] 原文 自定义RecyclerView.ItemDecoration,实现RecyclerView的分割线效果 字数1598 阅读302 评论2 喜欢23 1.背景   RecyclerView ...

  7. RecyclerView 滑动检测 (上滑 up)(下滑 down)(顶部 top)(底部 bottom)

      RecyclerView 给我们的可以检测滑动事件的接口 只有 一个方法 recyclerview.setOnScrollListener()或者 recyclerview.addOnScroll ...

  8. IT蓝豹--RecyclerView加载不同view实现效果

    本项目由开发者:黄洞洞精心为初学者编辑RecyclerView的使用方法. RecyclerView加载不同view实现效果,支持加载多个view,并且支持用volley获取数据, 项目主要介绍: 初 ...

  9. RecyclerView再封装

    RecyclerView做为ListView的替代品,已经出了很久了,既然是替代品,那自然有些ListView没有的优点.比如说:可以随意切换list,grid,stagger.可以指定一个或多个it ...

随机推荐

  1. 3110 PHP常见问题

    1.中文显示 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&g ...

  2. android studio使用说明

    一.学习的基本配置文档,搞好各种参数的基本配置,熟练使用. C:\Program Files\Java\jdk1.7.0_09\bin   二.problems meet in weather and ...

  3. Chrome 插件: 起动本地应用 (Native messaging)

    Chrome 插件: 起动本地应用 (Native messaging) www.MyException.Cn  网友分享于:2014-08-01  浏览:3次   Chrome 插件: 启动本地应用 ...

  4. win系统 添加、修改右键“发送到”

    发现大家在往U盘,移动硬盘传东西的时候,总是喜欢在本地把文件复制(缺德的还会用剪切)然后在打开U盘选择粘贴,其实完全没必要使用那么多步骤,不知道大家注意没有,只要在你本地的文件上右键--发送到--你的 ...

  5. 20145208 实验三 Java面向对象程序设计

    20145208 实验三 Java面向对象程序设计 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 实验步 ...

  6. Scala学习笔记(六):Scala程序

    想要编写能够独立运行的Scala程序,就必须创建有main方法(仅带一个参数Array[String],且结果类型为Unit)的单例对象. 任何拥有合适签名的main方法的单例对象都可以用来作为程序的 ...

  7. c++实现简单计算器

    帮一个同学写的,非计算机类专业,应付交差,也没什么功能,两个数的加减乘除运算,以及三角函数的运算.要求用到模板.运算符重载和异常处理. 一直以来都是用的java,没怎么用过c++,就当是复习了一下c+ ...

  8. 微信第一个“小程序”亮相:不是APP胜似APP!

    前天晚上,微信终于推出了“小程序”功能.看过效果演示之后,网友表示,好多App可以卸载了! 据了解,微信“小程序”已首批开放给200名拥有微信服务号的开发者进行内测,而且目前开发者发布的小程序无法在用 ...

  9. 关于hangfire的使用

    hangfire 是一个分布式后台执行服务.用它可以代替ThreadPool.QueunItemWork等原生方法.当然4.5后的 task也是相当好用且功能强大.不过如果想分布式处理并且可监控的话, ...

  10. node判断文件目录是否存在

    'use strict'; //这是一个简单的应用 var path = require('path'); var fs = require("fs") ; global.l = ...