介绍

RecyclerView是一种高级的ListView,以后可以用它来代替ListView

CardView则是一种更好看的视图,使用比较简单,这里我把他俩放在一起介绍

基本使用步骤

导入依赖

我们得先导入RecyclerView和CardView的依赖

compile 'com.android.support:recyclerview-v7:26.0.0'
compile 'com.android.support:cardview-v7:26.0.0'
//recyclerView和cardView库

在主布局中加入RecyclerView

在activity_main.xml中加入RecyclerView

<android.support.v7.widget.RecyclerViewandroid:id="@+id/rv_recycler"android:layout_width="match_parent"android:layout_height="wrap_content"></android.support.v7.widget.RecyclerView>

用法其实跟listView差不多

创建item的布局

为RecyclerView的子项创建布局,名之为iterm.recycler.xml

<android.support.v7.widget.CardViewxmlns:card_view="http://schemas.android.com/apk/res-auto" <!-- 注意cardView的命名空间 -->xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"card_view:cardCornerRadius="4dp" <!-- 设置卡片四个角的弧度半径 -->android:layout_margin="10dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="90dp"android:orientation="horizontal"><ImageViewandroid:id="@+id/iv_img"android:layout_weight="1"android:layout_width="90dp"android:gravity="center"android:layout_height="match_parent" /><TextViewandroid:id="@+id/tv_img"android:layout_weight="1"android:layout_width="50dp"android:gravity="center"android:layout_height="match_parent" /><Buttonandroid:id="@+id/btn_img"android:text="这是哪个队"android:gravity="center"android:layout_width="wrap_content"android:layout_height="match_parent" /></LinearLayout></android.support.v7.widget.CardView>

为了好看我用了CardView做为子项的根布局,注意它的用法,参加注释

在MainActivity中设置RecyclerView

@BindView(R.id.rv_recycler)
RecyclerView recyclerView;@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activty_main);ButterKnife.bind(this);recyclerView.setLayoutManager(new LinearLayoutManager(this)); // 设置线性布局...
}

我使用了ButterKnife来初始化控件(其实就是findViewById()),现在先不管他,以后再介绍用法

通过recyclerView.setLayoutManager()可以指定recyclerView是哪种布局,这里我直接使用线性布局

构造Adapter类

RecyclerView跟ListView一样,也需要适配器。这里我们写一个适配器类,继承RecyclerView.Adapter

public class AdapterForRecyclerVIew extends RecyclerView.Adapter {private LinkedList<String> urls = new LinkedList<>();private LinkedList<String> descriptions = new LinkedList<>();private Context context = null;private String TAG = "AdapterForRecyclerVIew";public AdapterForRecyclerVIew(LinkedList<String> urls,LinkedList<String> descriptions, Context context) {this.urls = urls;this.descriptions = descriptions;this.context = context;}@Overridepublic RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {CardView layout = (CardView) LayoutInflater.from(context).inflate(R.layout.item_recycler, parent, false); // 要inflate子项的根节点 carViewreturn new MyViewHolderForImage(layout);}@Overridepublic void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {MyViewHolderForImage holderForImage = (MyViewHolderForImage) holder;Picasso.with(context).load(urls.get(position - 1)).into(holderForImage.getImageView());holderForImage.getTextView().setText(descriptions.get(position - 1));}@Overridepublic int getItemCount() {return urls.size();}
}

里面的三个方法onCreateViewHolder()、onBindViewHolder()、getItemCount()都是我们必须要实现的。

其中onCreateViewHolder()用来创建子项的viewHolder,所以我们要新建一个ViewHolder类,继承RecyclerView.ViewHolder,这个ViewHolder里面就是子项的所有控件,子项的UI逻辑,都放在ViewHolder中,可以作为mvp设计模式中的presenter(代码下一步再说)

onBindViewHolder()则是加载子项viewHolder的内容,参数里面的holder就是上一个方法onCreateViewHolder()中返回过来的

getItemCount()方法决定了recyclerView要显示多少个子项

创建ViewHolder类

根据上一步说的,我们把子项逻辑都放在ViewHolder中

public class MyViewHolderForImage extends RecyclerView.ViewHolder {@BindView(R.id.iv_img) ImageView imageView;@BindView(R.id.tv_img) TextView textView;public MyViewHolderForImage(View itemView) {super(itemView);ButterKnife.bind(this,itemView); // 根据adapter中的onCreateViewHolder(),这里传进来的itermView就是cardViewtextView.setVisibility(View.INVISIBLE);}@OnClick(R.id.btn_img)public void changeVisibility(){textView.setVisibility(View.VISIBLE);}public ImageView getImageView() {return imageView;}public TextView getTextView() {return textView;}
}

还是用了ButterKnife绑定控件,设置onClick监听

为recyclerView设置adapter,并初始化数据

回到onCreate(),设置一下adapter,并赋予一些数据

adapter = new AdapterForRecyclerVIew(urls, descriptions, this);addUrls();
addDescriptions();recyclerView.setAdapter(adapter);
private void addDescriptions() {descriptions.add("南部之星拜仁慕尼黑");descriptions.add("骄傲的大黄蜂多特蒙德");descriptions.add("红魔曼联");descriptions.add("蓝军切尔西");
}
private void addUrls() {urls.add("http://n.sinaimg.cn/sports/transform/20170216/1s3V-fyarzzv2801842.jpg");urls.add("http://www.zq1.com/Upload/20170415/235459msc9i5yiqracirfw.jpg");urls.add("http://k.sinaimg.cn/n/sports/transform/20160424/dfCS-fxrqhar9877773.JPG/w570fe9.jpg");urls.add("http://n.sinaimg.cn/sports/transform/20170423/L9Uj-fyeqcac1387497.jpg");
}

由于我是先设置数据,再设置适配,所以不用notifyDataSetChanged()

效果

ok,这就是recyclerView的基本用法

多种类型子项混排

可以看到,在录屏gif种,最上面最下面是文字,而这些文字也是RecyclerView的子项,怎么实现呢?只需要增加相应子项的布局文件和对应ViewHolder、再改变一下adapter就行

添加新子项的xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextViewandroid:id="@+id/tv_item"android:gravity="center"android:layout_gravity="center"android:layout_width="match_parent"android:layout_height="wrap_content" /></LinearLayout>

添加新子项的viewHolder

public class MyViewHolderForText extends RecyclerView.ViewHolder {@BindView(R.id.tv_item) TextView textView;public MyViewHolderForText(View itemView) {super(itemView);ButterKnife.bind(this,itemView);}public TextView getTextView() {return textView;}
}

更改adapter

添加子项类型枚举

因为有多种子项,为了鉴别,我们最好定义一种枚举,来区分子项类型

private enum viewType {TYPE_TEXT, TYPE_IMAGE;
}
覆写getItemViewType方法

为了获取子项类型,我们需要覆写父类种getItemViewType()方法

@Override
public int getItemViewType(int position) {if (position == 0 || position == urls.size() + 1) {return viewType.TYPE_TEXT.ordinal();}return viewType.TYPE_IMAGE.ordinal();
}
修改getItemCount方法

这时我们要多显示两项,所以返回值要+2

@Override
public int getItemCount() {return urls.size() + 2;
}
修改onCreateViewHolder方法和onBindViewHolder方法

根据viewType来获取不同的viewHolder或执行不同逻辑

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {if (viewType == AdapterForRecyclerVIew.viewType.TYPE_IMAGE.ordinal()) {CardView layout = (CardView) LayoutInflater.from(context).inflate(R.layout.item_recycler, parent, false);return new MyViewHolderForImage(layout);} else {LinearLayout layout = (LinearLayout) LayoutInflater.from(context).inflate(R.layout.text_item_recycler, parent, false);return new MyViewHolderForText(layout);}
}@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {if (holder.getItemViewType() == viewType.TYPE_IMAGE.ordinal()) {MyViewHolderForImage holderForImage = (MyViewHolderForImage) holder;Picasso.with(context).load(urls.get(position - 1)).into(holderForImage.getImageView()); // 因为第一个是textView,所以url的索引是position-1holderForImage.getTextView().setText(descriptions.get(position - 1));} else {((MyViewHolderForText) holder).getTextView().setText("宋泽嶒");}
}

这样,就大功告成了

结语

RecyclerView可以帮助我们更好地实现mvp,也是一种性能更好的listView

Android开发学习之RecyclerView+CardView的使用相关推荐

  1. android开发用百度识别图片格式,Android开发学习之路-机器学习库(图像识别)、百度翻译...

    对于机器学习也不是了解的很深入,今天无意中在GitHub看到一个star的比较多的库,就用着试一试,效果也还行.比是可能比不上TensorFlow的,但是在Android上用起来比较简单,毕竟Tens ...

  2. Android开发学习Part3

    Android开发学习Part3 可点击的图片 输入控件 菜单和选择器 用户导航 选项卡导航 RecyclerView使用 可点击的图片 心得: 现在的FloatingActionButton写法如下 ...

  3. android培训内容明细,记录Android开发学习

    记录Android开发学习 Menu菜单学习 1.掌握Android中菜单的创建. 2.掌握Intent信使组件. 创建菜单Menu 我们模仿微信菜单栏学习,创建一个于微信菜单栏相似的菜单 那么我们应 ...

  4. android开发学习之路——连连看之游戏逻辑(五)

    GameService组件则是整个游戏逻辑实现的核心,而且GameService是一个可以复用的业务逻辑类. (一)定义GameService组件接口 根据前面程序对GameService组件的依赖, ...

  5. Android开发学习---使用Intelij idea 13.1 进行android 开发

    Android开发学习---使用Intelij idea 13.1 进行android 开发 原文:Android开发学习---使用Intelij idea 13.1 进行android 开发 1.为 ...

  6. 《Java和Android开发学习指南(第2版)》—— 1.5 本章小结

    本节书摘来异步社区<Java和Android开发学习指南(第2版)>一书中的第1章,第1.5节,作者:[加]Budi Kurniawan,更多章节内容可以访问云栖社区"异步社区& ...

  7. 《Java和Android开发学习指南(第2版)》——第2章,第2.10节本章小结

    本节书摘来自异步社区<Java和Android开发学习指南(第2版)>一书中的第2章,第2.10节本章小结,作者 [加]Budi Kurniawan,更多章节内容可以访问云栖社区" ...

  8. Android开发学习之基于ViewPager实现Gallery画廊效果

    通过我们前面的学习,我们知道ViewPager是可以做出近乎完美的滑动体验,回顾整个Android,我们发现Gallery具备同样的特点,于是我们大胆地猜想,Gallery是否和ViewPager之间 ...

  9. Android开发学习总结(四)——Eclipse在线安装ADT插件

    Android开发学习总结(四)--Eclipse在线安装ADT插件 要想使用Eclipse开发Android应用,首先要安装一个ADT插件,在此记录一下在Eclipse中采用在线安装的方式ADT插件 ...

最新文章

  1. 【C++】lambda 表达式
  2. 《30天吃掉那只 TensorFlow2.0 》(附下载)
  3. mysql 释放错误连接_JSP连接MySQL后数据库链接释放的错误
  4. java12小时制的时间转换为24小时制
  5. Photo Pos Pro 3中文版
  6. mysql的存储过程基本使用
  7. WP7之Application Bar控件
  8. java python算法_用Java,Python和C ++示例解释的搜索算法
  9. python android 库_Python库
  10. 点触科技:构建实时计算和数据仓库解决方案
  11. 为numpy数组增加一个维度的方法
  12. 如何通过低代码平台搭建以“督办”为中心的办公管理系统
  13. 阿里云快照如何恢复到另外一台服务器
  14. 例3.2 计算存款利息。有1000元,存一年。(1)活期,年利率为r1,(2)一年期定期,年利率为r2,(3)存两年半年定期,年利率为r3。
  15. 第一学期对于液质、气相处理过程的总结
  16. PDF文件打开密码忘记了,怎么办?
  17. 如何高效的管理参考文献
  18. 中信银行核心数据库下移,为什么会选择它?
  19. 软件人如何快速晋升CTO(一)
  20. 想买个kindle保护套!

热门文章

  1. iOS ipv4和ipv6转换
  2. 【CGAL】表面细化
  3. 微信小程序 怎么插入图片?image组件的使用教程。
  4. 一个基于Vue的移动端多文件上传插件,支持常见图片的上传。
  5. JDBC Java对数据库增删改查(完整案例)
  6. 80386的寄存器组成
  7. springboot整合mina
  8. 场内交易基金实时数据 API 数据接口
  9. css气泡动画特效演示
  10. iOS开发之OC入门(类的使用)