随着 Google 推出了全新的设计语言 Material Design,还迎来了新的 Android 支持库 v7,其中就包含了 Material Design 设计语言中关于 Card 卡片概念的实现 —— CardView。RecyclerView也是谷歌V7包下新增的控件,用来替代ListView的使用,在RecyclerView标准化了ViewHolder类似于ListView中convertView用来做视图缓存.

RecyclerView的优点就是,他可以通过设置LayoutManager来快速实现listview、gridview、瀑布流的效果,而且还可以设置横向和纵向显示,添加动画效果等。

CardView实现卡片化效果。

下拉加载使用SwipeRefreshLayout,是官方的下拉刷新控件,简洁美观的风格使其广泛应用在项目中。美中不足的是SwipeRefreshLayout缺少上拉加载的效果,今天结合RecyclerView实现一个支持下拉刷新与上拉加载的SwipeRefreshLayout。

案例包含了:RecyclerView基本使用,RecyclerView上拉刷新下拉加载,RecyclerView多Item布局,CardView基本使用和CardView上拉刷新下拉加载。如图:(注:第三个案例线显示格式在模拟器上有问题,手机则没问题的,手机测试效果更佳)

布局:

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

Activity:

  1. public class RecyclerViewActivity extends Activity {
  2.  
  3. private RecyclerView recyclerView;
  4. private List<String> mDatas;
  5. private RecyclerAdapter1 adapter;
  6. @SuppressLint("InlinedApi")
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.demo1);
  11. initData();
  12. initView();
  13. }
  14. private void initView()
  15. {
  16. recyclerView=(RecyclerView) findViewById(R.id.demo1_recycler);
  17. // 设置布局管理LayoutManager
  18. LinearLayoutManager manager=new LinearLayoutManager(this);
  19. //设置水平或者垂直
  20. // manager.setOrientation(LinearLayoutManager.HORIZONTAL);
  21. recyclerView.setLayoutManager(manager);
  22. // (可选)如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
  23. recyclerView.setHasFixedSize(true);
  24. adapter=new RecyclerAdapter1(this,mDatas);
  25. recyclerView.setAdapter(adapter);
  26. adapter.setOnItemClickListener(new IOnClickListenter() {
  27. @Override
  28. public void onItemClick(View view, int position) {
  29. Toast.makeText(getApplicationContext(),position+"---"+mDatas.get(position),Toast.LENGTH_LONG).show();
  30. }
  31. });
  32.  
  33. }
  34. private void initData() {
  35. mDatas = new ArrayList<String>();
  36. for (int i = 0; i <= 50; i++) {
  37. mDatas.add("item---" +i);
  38. }
  39. }
  40.  
  41. }

Adapter:

  1. public class RecyclerAdapter1 extends RecyclerView.Adapter<RecyclerAdapter1.ViewHolder>{
  2.  
  3. private Context context;
  4. private List<String> list;
  5. public RecyclerAdapter1(Context context, List<String> list){
  6. this.context=context;
  7. this.list=list;
  8. }
  9.  
  10. @Override
  11. public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  12. View view= LayoutInflater.from(context).inflate(R.layout.demo1_item,parent,false);
  13. ViewHolder viewHolder=new ViewHolder(view);
  14. return viewHolder;
  15. }
  16.  
  17. @Override
  18. public void onBindViewHolder(ViewHolder holder, int position) {
  19. holder.textView.setText(list.get(position));
  20. }
  21.  
  22. @Override
  23. public int getItemCount() {
  24. return list.size();
  25. }
  26. private IOnClickListenter onClickListenter=null;
  27. public void setOnItemClickListener(IOnClickListenter listener)
  28. {
  29. this.onClickListenter=listener;
  30. }
  31.  
  32. public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
  33. private TextView textView;
  34.  
  35. public ViewHolder(View view)
  36. {
  37. super(view);
  38. textView=(TextView)view.findViewById(R.id.textview1);
  39. textView.setOnClickListener(this);
  40. }
  41. @Override
  42. public void onClick(View v) {
  43. if (onClickListenter != null) {
  44. onClickListenter.onItemClick(v,getPosition());
  45. }
  46. }
  47. }
  48. }

上拉刷新下拉加载布局

  1. <android.support.v4.widget.SwipeRefreshLayout
  2. android:id="@+id/swipeRefreshLayout"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5.  
  6. <android.support.v7.widget.RecyclerView
  7. android:id="@+id/recyclerView"
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent">
  10.  
  11. </android.support.v7.widget.RecyclerView>
  12.  
  13. </android.support.v4.widget.SwipeRefreshLayout>

上拉刷新下拉加载Activity

  1. public class RecyclerViewPullActivity extends Activity {
  2.  
  3. private SwipeRefreshLayout swipeRefreshLayout;
  4. private MyRefreshRecyclerView recyclerView;
  5. public static List<String> list=new ArrayList<String>();
  6. private RecyclerAdapter2 adapter;
  7. private Handler mHandler = new Handler();
  8.  
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.demo2);
  13. initView();
  14. }
  15. private void initView(){
  16. swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_layout);
  17. recyclerView = (MyRefreshRecyclerView) findViewById(R.id.recycler);
  18. adapter=new RecyclerAdapter2();
  19. recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
  20. swipeRefreshLayout.setColorSchemeResources(R.color.blue,R.color.green);
  21. swipeRefreshLayout.post(new Runnable() {
  22. @Override
  23. public void run() {
  24. swipeRefreshLayout.setRefreshing(true);
  25. }
  26. });
  27. mHandler.postDelayed(new Runnable() {
  28. @Override
  29. public void run() {
  30. getData();
  31. recyclerView.setAdapter(adapter);
  32. adapter.notifyDataSetChanged();
  33. swipeRefreshLayout.setRefreshing(false);
  34. }
  35. },1500);
  36. swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
  37. @Override
  38. public void onRefresh() {
  39. mHandler.postDelayed(new Runnable() {
  40. @Override
  41. public void run() {
  42. getData();
  43. recyclerView.setAdapter(adapter);
  44. adapter.notifyDataSetChanged();
  45. swipeRefreshLayout.setRefreshing(false);
  46. }
  47. }, 1500);
  48. }
  49. });
  50. recyclerView.setMyRefreshRecyclerViewListener(new MyRefreshRecyclerView.MyRefreshRecyclerViewListener() {
  51. @Override
  52. public void onLoadMore() {
  53. mHandler.postDelayed(new Runnable() {
  54. @Override
  55. public void run() {
  56. if (list.size() > 14) {
  57. recyclerView.setLoadMore(true);
  58. } else {
  59. int randomInt = new Random().nextInt(100);
  60. list.add("上拉加载添加数字:" + randomInt);
  61. adapter.notifyDataSetChanged();
  62. recyclerView.setLoadMore(false);
  63. }
  64.  
  65. }
  66. }, 1000);
  67. }
  68. });
  69. }
  70.  
  71. private void getData() {
  72. list.clear();
  73. Random random = new Random();
  74. while (list.size() < 12) {
  75. int randomInt = random.nextInt(100);
  76. list.add(String.valueOf(randomInt));
  77. }
  78. }
  79. }

AS添加依赖库:

  1. compile 'com.android.support:recyclerview-v7:23.2.1'
  2. compile 'com.android.support:cardview-v7:23.2.1'

Eclipse下使用     RecyclerView.Jar       CardView.Jar 点击下载

由于代码太多,完整代码未给出,源码直接下载即可

源码点击下载

Android之 RecyclerView,CardView 详解和相对应的上拉刷新下拉加载的更多相关文章

  1. Android 使用RecyclerView SnapHelper详解

    简介 RecyclerView在24.2.0版本中新增了SnapHelper这个辅助类,用于辅助RecyclerView在滚动结束时将Item对齐到某个位置.特别是列表横向滑动时,很多时候不会让列表滑 ...

  2. Android ActionBar详解(二):ActionBar实现Tabs标签以及下拉导航

    一.添加标签 Tabs   在ActionBar中实现标签页可以实现android.app.ActionBar.TabListener ,重写onTabSelected.onTabUnselected ...

  3. iOS-上拉刷新,下拉加载-----------详解

    一.使用的第三方库 1.AFNetworking       ----> 网络请求 2. MJRefresh           ----> 刷新 3. MBProgressHUD  -- ...

  4. Android 自定义 ListView 上下拉动“刷新最新”和“加载更多”歌曲列表

    本文内容 环境 测试数据 项目结构 演示 参考资料 本文演示,上拉刷新最新的歌曲列表,和下拉加载更多的歌曲列表.所谓"刷新最新"和"加载更多"是指日期.演示代码 ...

  5. Android 高级UI设计笔记07:RecyclerView 的详解

    1. 使用RecyclerView       在 Android 应用程序中列表是一个非常重要的控件,适用场合非常多,如新闻列表.应用列表.消息列表等等,但是从Android 一出生到现在并没有非常 ...

  6. Android RecyclerView使用详解(三)

    在上一篇(RecyclerView使用详解(二))文章中介绍了RecyclerView的多Item布局实现,接下来要来讲讲RecyclerView的Cursor实现,相较于之前的实现,Cursor有更 ...

  7. Android RecyclerView使用详解(二)

    在上一篇(RecyclerView使用详解(一))文章中简单的介绍了RecyclerView的基本用法,接下来要来讲讲RecyclerView的更多用法,要实现不同的功能效果,大部分都还是在于Recy ...

  8. ANDROID L——Material Design详解(UI控件)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! Android L: Google已经确认Android L就是Android Lolli ...

  9. 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING

    <Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th  2014 Email:skyseraph00@163.com 更多精彩请直接 ...

随机推荐

  1. appium记录

    npm uninstall appium -g npm install -g cnpm --registry=https://registry.npm.taobao.org cnpm install ...

  2. clock_gettime接口和linux时间系统

    RTC/OSCRTC,Real Time Clock,真实时钟,也叫做CMOS时钟,又叫walltimeOSC,Operation System Clock,系统时钟.在开机时操作系统取得RTC中的时 ...

  3. 贪婪算法(Greedy Algorithm)

    Greedy Algorithm <数据结构与算法--C语言描述> 图论涉及的三个贪婪算法 Dijkstra 算法 Prim 算法 Kruskal 算法 Greedy 经典问题:coin ...

  4. 04:sqlalchemy操作数据库

    目录: 1.1 ORM介绍(作用:不用原生SQL语句对数据库操作) 1.2 安装sqlalchemy并创建表 1.3 使用sqlalchemy对表基本操作 1.4 一对多外键关联 1.5 sqlalc ...

  5. python脚本监控获取当前Linux操作系统[内存]/[cpu]/[硬盘]/[登录用户]

    此脚本应用在linux, 前提是需要有python和python的psutil模块 脚本 #!/usr/bin/env python # coding=utf-8 import sys import ...

  6. 20145314郑凯杰《网络对抗技术》实验8 WEB基础实践

    20145314郑凯杰<网络对抗技术>实验8 WEB基础实践 一.实验准备 1.0 实验目标和内容 Web前端HTML.能正常安装.启停Apache.理解HTML,理解表单,理解GET与P ...

  7. 小测(noip2005的两道题) 2017.3.3

    过河 题目描述 Description 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把 ...

  8. 在linux桌面上显示图标

    把应用程序的图标添加到桌面上 左图显示了把应用程序的图标添加到桌面上的两种方法,哪种更好看? 想要把应用程序图标添加到桌面上,请先确保已设置了在桌面上显示图标,方法是: 1.安装gnome-tweak ...

  9. Leetcode ——Partition Equal Subset Sum

    Question Given a non-empty array containing only positive integers, find if the array can be partiti ...

  10. C#学习笔记(二):变量、数据类型和运算符

    变量.数据类型       给变量赋值,如果想指定float,在数字后面加上F/f:如果想指定decimal,在数字后面加上m.   0-9:48-57 A-Z:65-90 a-z:97-122   ...