最近学习了android5.0中新增的一个组件RecycleView,是用来代替当前的listview开发的,是因为在RecycleView中已经有了viewholder缓存,并且不同的item之间可以设置不同的布局。能非常有效地维护了意见数量有限,滚动大的数据集。使用 RecyclerView当你拥有的数据的集合,它的元素在运行时改变基于用户行为和网络事件的小部件

首先看看RecyclerView的一个小例子:

需要引入:android-support-v7-appcompat.jar

android-v7-RecyclerView.jar来支持低版本的android系统

新建一个my_layout.xml布局文件:里边放置一个RecyclerView

  1. <android.support.v7.widget.RecyclerView
  2. android:id="@+id/rvlist"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:scrollbars="vertical"
  6. />

在之前的listview开发中,我们需要自定义viewholder来缓存listView中的数据,而在RecyclerView中,已经封装好了viewholder在adapter中,接下来自定义我们的adapter

  1. public class MyAdapter2 extends RecyclerView.Adapter<MyAdapter2.ViewHolder>
  2. {
  3. // 数据集
  4. private String[] mDataset;
  5. public MyAdapter2(String[] dataset)
  6. {
  7. super();
  8. mDataset = dataset;
  9. }
  10. @Override
  11. public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)
  12. {
  13. // 创建一个View,简单起见直接使用系统提供的布局,就是一个TextView
  14. View view = View.inflate(viewGroup.getContext(),R.layout.viewholder_item, null);
  15. // 创建一个ViewHolder
  16. ViewHolder holder = new ViewHolder(view);
  17. return holder;
  18. }
  19. @Override
  20. public void onBindViewHolder(ViewHolder viewHolder, int i)
  21. {
  22. // 绑定数据到ViewHolder上
  23. viewHolder.mTextView.setText(mDataset[i]);
  24. }
  25. @Override
  26. public int getItemCount()
  27. {
  28. return mDataset.length;
  29. }
  30. public static class ViewHolder extends RecyclerView.ViewHolder
  31. {
  32. public TextView mTextView;
  33. public ViewHolder(View itemView)
  34. {
  35. super(itemView);
  36. //          mTextView = (TextView) itemView;
  37. mTextView = (TextView) itemView.findViewById(R.id.view_text_id);
  38. }
  39. }
  40. }

在activity这样调用,并设置adapter

  1. RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rvlist);
  2. // 创建一个线性布局管理器
  3. LinearLayoutManager layoutManager = new LinearLayoutManager(this);
  4. layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
  5. // 设置布局管理器
  6. recyclerView.setLayoutManager(layoutManager);
  7. // 创建数据集
  8. String[] dataset = new String[100];
  9. for (int i = 0; i < dataset.length; i++){
  10. dataset[i] = "item" + i;
  11. }
  12. // 创建Adapter,并指定数据集
  13. MyAdapter2 adapter = new MyAdapter2(dataset);
  14. // 设置Adapter
  15. recyclerView.setAdapter(adapter);
  16. }

运行效果:

在这个例子中只是用到了最基本的布局,下面结合android中新增的CardView和RecycleView实现一个复杂的布局:

先看效果图:

CardView继承自FrameLayout,允许你在card视图中显示信息. CardView也可以设置阴影和圆角。(其实现在很多应用都自定义了Card视图,Google这回将card视图作为基本控件,可以拿来直接使用了)

Layout中为CardView设置圆角使用card_view:cardCornerRadius属性

代码中为CardView设置圆角使用CardView.setRadius方法

为CardView设置背景颜色使用card_view:cardBackgroundColor属性

1.在item布局中引入cardview组件

  1. <android.support.v7.widget.CardView
  2. android:id="@+id/cardview_id"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. app:cardCornerRadius="5dp"
  6. app:cardElevation="0dp" >
  7. <RelativeLayout
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent"
  10. android:padding="5dp" >
  11. <ImageView
  12. android:id="@+id/image_id"
  13. android:layout_width="20dp"
  14. android:layout_height="20dp"
  15. android:layout_alignParentLeft="true"
  16. />
  17. <TextView
  18. android:id="@+id/text_id"
  19. android:layout_width="wrap_content"
  20. android:layout_height="match_parent"
  21. android:textColor="#f89ef5"
  22. android:textSize="20dp"
  23. android:layout_centerInParent="true" />
  24. </RelativeLayout>
  25. </android.support.v7.widget.CardView>

需要注意的是要在最底层的layout中引入cardview的命名空间:

xmlns:app=http://schemas.android.com/apk/res-auto

要实现不同的item有不同的布局,需要有一个type字段来作为区分,这里,我新建一个UserInfo类,如下:

  1. public class UserInfo {
  2. public static final int hasImage = 1;
  3. public static final int noImage = 2;
  4. private String mUserName;
  5. private int userImage;
  6. int type;
  7. public String getmUserName() {
  8. return mUserName;
  9. }
  10. public void setmUserName(String mUserName) {
  11. this.mUserName = mUserName;
  12. }
  13. public int getUserImage() {
  14. return userImage;
  15. }
  16. public void setUserImage(int userImage) {
  17. this.userImage = userImage;
  18. }
  19. public int getType() {
  20. return type;
  21. }
  22. public void setType(int type) {
  23. this.type = type;
  24. }
  25. public UserInfo(String mUserName, int type) {
  26. this.mUserName = mUserName;
  27. this.type = type;
  28. }
  29. public UserInfo(String mUserName, int userImage, int type) {
  30. this.mUserName = mUserName;
  31. this.userImage = userImage;
  32. this.type = type;
  33. }
  34. }

hasImage和noImage分别表示该item需不需要加载图片,来加载不同的布局。

接下来看看Adapter的代码:

  1. public class MyAdapter extends RecyclerView.Adapter<ViewHolder>{
  2. private List<UserInfo>mList = null;
  3. private Context context = null;
  4. public MyAdapter(List<UserInfo> mList, Context context) {
  5. super();
  6. this.mList = mList;
  7. this.context = context;
  8. //      for (int i = 0; i < mList.size(); i++) {
  9. //          Log.d("liuhang","==="+mList.get(i).getmUserName()+"==="+mList.get(i).getUserImage());
  10. //      }
  11. }
  12. public void addToList(UserInfo info,int position) {
  13. mList.add(0, info);
  14. notifyItemInserted(position);
  15. notifyDataSetChanged();
  16. }
  17. public class TextOnClick implements OnClickListener {
  18. private int position = 0;
  19. public TextOnClick(int position) {
  20. this.position = position;
  21. }
  22. @Override
  23. public void onClick(View v) {
  24. Toast.makeText(context,"text the name:"+mList.get(position).getmUserName(),1000).show();
  25. }
  26. }
  27. public class ImageOnclick implements OnClickListener {
  28. private int position = 0;
  29. public ImageOnclick(int position) {
  30. this.position = position;
  31. }
  32. @Override
  33. public void onClick(View v) {
  34. // TODO Auto-generated method stub
  35. Toast.makeText(context,"image the imageId:"+mList.get(position).getUserImage(),1000).show();
  36. }
  37. }
  38. public class ItemOnClick implements OnItemClickListener {
  39. @Override
  40. public void onItemClick(AdapterViewCompat<?> arg0, View arg1, int arg2,
  41. long arg3) {
  42. // TODO Auto-generated method stub
  43. Toast.makeText(context,"you choose the item",1000).show();
  44. }
  45. }
  46. @Override
  47. public int getItemCount() {
  48. return mList.size();
  49. }
  50. public class TextViewHolder extends RecyclerView.ViewHolder {
  51. public TextView textView = null;
  52. public TextViewHolder(View view) {
  53. super(view);
  54. this.textView = (TextView) view.findViewById(R.id.text_id);
  55. }
  56. }
  57. public class ImageTextViewHolder extends RecyclerView.ViewHolder {
  58. public ImageView imageView = null;
  59. public TextView textView = null;
  60. public ImageTextViewHolder(View view) {
  61. super(view);
  62. this.imageView = (ImageView) view.findViewById(R.id.image_id);
  63. this.textView = (TextView) view.findViewById(R.id.text_id);
  64. }
  65. }
  66. @Override
  67. public int getItemViewType(int position) {
  68. // TODO Auto-generated method stub
  69. return mList.get(position).getType();
  70. }
  71. @Override
  72. public void onBindViewHolder(ViewHolder holder, int position) {
  73. switch (getItemViewType(position)) {
  74. case UserInfo.hasImage:
  75. ImageTextViewHolder imageTextViewHolder = (ImageTextViewHolder) holder;
  76. imageTextViewHolder.imageView.setImageResource(mList.get(position).getUserImage());
  77. imageTextViewHolder.textView.setText(mList.get(position).getmUserName());
  78. imageTextViewHolder.textView.setOnClickListener(new TextOnClick(position));
  79. imageTextViewHolder.imageView.setOnClickListener(new ImageOnclick(position));
  80. break;
  81. case UserInfo.noImage:
  82. TextViewHolder textViewHolder = (TextViewHolder) holder;
  83. textViewHolder.textView.setText(mList.get(position).getmUserName());
  84. textViewHolder.textView.setOnClickListener(new TextOnClick(position));
  85. }
  86. }
  87. @Override
  88. public ViewHolder onCreateViewHolder(ViewGroup parent, int type) {
  89. ViewHolder holder = null;
  90. View view = null;
  91. switch (type) {
  92. case UserInfo.hasImage:
  93. view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_text_image_item,null);
  94. holder = new ImageTextViewHolder(view);
  95. break;
  96. case UserInfo.noImage:
  97. view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_text_item,null);
  98. holder = new TextViewHolder(view);
  99. break;
  100. }
  101. <a target=_blank href="http://download.csdn.net/detail/mockingbirds/8312357">源码下载</a>
  102. return holder;
  103. }
  104. }

在activity中这样调用:

    1. RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_id);
    2. recyclerView.setHasFixedSize(true);
    3. LinearLayoutManager linaLayout = new LinearLayoutManager(this);
    4. linaLayout.setOrientation(1);
    5. recyclerView.setLayoutManager(linaLayout);
    6. recyclerView.getRecycledViewPool().setMaxRecycledViews(0, 10);
    7. int[]userImage = {R.drawable.icon08,R.drawable.icon00,R.drawable.icon01,
    8. R.drawable.icon02,R.drawable.icon03,R.drawable.icon04,
    9. R.drawable.icon05,R.drawable.icon06,R.drawable.icon07};
    10. List<UserInfo>userList = new ArrayList<UserInfo>();
    11. int position = 0;
    12. for (int i = 0; i < 35; i++) {
    13. position = (int) (Math.random() * 8);
    14. UserInfo userInfo1 = new UserInfo("zhangsan"+i,2);
    15. UserInfo userInfo2 = new UserInfo("lisi"+i,userImage[position],1);
    16. userList.add(userInfo1);
    17. userList.add(userInfo2);
    18. }
    19. final MyAdapter adapter= new MyAdapter(userList, this);
    20. recyclerView.setAdapter(adapter);
    21. recyclerView.setOnClickListener(new OnClickListener() {
    22. @Override
    23. public void onClick(View v) {
    24. // TODO Auto-generated method stub
    25. Toast.makeText(MyActivity.this,"you choose the item",1000).show();
    26. }
    27. });
    28. Button button = (Button) findViewById(R.id.add);
    29. button.setOnClickListener(new OnClickListener() {
    30. @Override
    31. public void onClick(View v) {
    32. adapter.addToList(new UserInfo("new add"+ newAdd++, 2),0);
    33. }
    34. });

android5.0中RecycleView的用法的更多相关文章

  1. 聊聊Android5.0中的水波纹效果

    水波纹效果已经不是什么稀罕的东西了,用过5.0新控件的小伙伴都知道这个效果,可是如果使用一个TextView或者Button或者其它普通控件的话,你是否知道如何给它设置水波纹效果呢?OK,我们今天就来 ...

  2. 关于MVC4.0中@Styles.Render用法与详解

    本文分享于http://keleyi.com/a/bjac/q74dybjc.htm文章,感觉写的蛮好所以就拿过来做笔记了,希望对大家有帮助 最近公司的新项目用了MVC 4.0,接下来一步步把 工作中 ...

  3. Android5.0中Material Design的新特性

    最近项目中需要用到Material Design,整理了下面几个常用的控件,以便记忆. 一.Snackbar 1.作用:与Toast类似,但是可以点击监听: 2.使用: (1)Snackbar调用静态 ...

  4. iOS 9.0中UIAlertController的用法。

    1.我为什么要写这篇博客记录它? 答:因为 UIAlertView和UIActionSheet 被划线了 苹果不推荐我们使用这两个类了,也不再进行维护和更新,为了以后方便使用我来记录一下.如图所示 正 ...

  5. iOS 9.0中UIAlertController的用法

    UIAlertView和UIActionSheet 被划线了. 苹果不推荐我们使用这两个类了.也不再进行维护和更新 正如苹果所说它现在让我们用UIAlertConntroller 并设置样式为UIAl ...

  6. 一个Activity掌握Android5.0新控件 (转)

    原文地址:http://blog.csdn.net/lavor_zl/article/details/51279386 谷歌在推出Android5.0的同时推出了一些新控件,Android5.0中最常 ...

  7. Android5.0新控件

    谷歌在推出Android5.0的同时推出了一些新控件,Android5.0中最常用的新控件有下面5种.  1. CardView(卡片视图) CardView顾名思义是卡片视图,它继承FrameLay ...

  8. Android5.0 ListView特效的简单实现

    Android5.0中对于动画可所谓是情有独钟,在设计规范中大量展现了listview的动画,其实也就是一个目的:将items动画显示出来.这个看起来很炫的效果,其实实现也蛮简单的,我下面就来用动画简 ...

  9. Android -- Camera2(Android5.0)

    Camera2 Camera2是Android5.0中的其中一个新的特性,新的API.与原来的camera API相比,不同之处在于: 原生支持RAW照片输出 突发拍摄模式 制约拍照速度的不再是软件而 ...

随机推荐

  1. Ubuntu16.04下Intellij IDEA不能输入中文的问题

    最近Ubuntu升级到16.04后发现IDEA的中文输入法不能正常切换了. 之前用的是fcitx安装的输入法, 折腾了半天才解决. 只需要修改idea.sh文件即可. 不需要折腾fcitx中的配置. ...

  2. linux 上不去网

    linux 上不去网   ip dns无误 ping可以到达网关 可能原因 网卡睡眠 ethtool eht0  //查看eht0网口基本设置 mii-tool -w eth0

  3. SQL多行拼接为一行

    使用简单T-SQL,拼接一列多行为一行.按SQL SERVER的说法叫做自拼接(PS:区分自连接) 还有一种方法是for xml path的方式,感觉不实用. declare @Result varc ...

  4. 浅谈负载均衡之【tomcat分布式session共享】

    1)整理集成所需jar kryo-1.0.3.jar kryo-serializers-0.8.jar memcached-2.4.2.jar memcached-session-manager-1. ...

  5. 微信热修复tinker及tinker server快速接入

    博客: 安卓之家 掘金: jp1017 微博: 追风917 CSDN: 蒋朋的家 简书: 追风917 当前热修复方案很多,今天研究了下微信的tinker,使用效果还是不错的,配合tinker serv ...

  6. Oracle OEM建库实例

    OEM是一个图形化的数据库管理员工具.它为数据库管理员提供了一个集中的系统管理工具,同时 它也是一个用来管理.诊断和调试多个数据库的工具,一个用来管理来自多个地点的多个网络节点和服务的工具.该工具可以 ...

  7. [Twisted] deferred

    Twisted提供一个优雅的实现(Deferred)来管理回调函数. Deferred Object 的结构 Deferred Object包含两个回调函数列表.一个用来保存成功的回调函数,另一个用来 ...

  8. JavaScript中的作用域和闭包

    首先强烈安利<你不知道的JavaScript>,JS初学者进阶必读. 对于从C++.Java等静态语言转向JavaScript的初学者(比如我)来说,JS一些与众不同而又十分要紧的特性使得 ...

  9. 数据挖掘学习笔记:挖掘频繁模式、关联和相关[ZZ]

    所 谓挖掘频繁模式,关联和相关,即指在出现的数据集中找到一个经常出现的序列模式或者是一个经常出现的数据结构.就像搞CPU设计的人知道,Cache的预 取机制有流预取和指针预取,前者就是发现流模式,即发 ...

  10. 网站访问架构cdn与负载均衡

    曾经见到知乎上有人问“为什么像facebook这类的网站需要上千个工程师维护?”,下面的回答多种多样,但总结起来就是:一个高性能的web系统需 要从无数个角度去考虑他,大到服务器的布局,小到软件中某个 ...