Android之 RecyclerView,CardView 详解和相对应的上拉刷新下拉加载

为什么80%的码农都做不了架构师?>>>   hot3.png

随着 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上拉刷新下拉加载。如图:(注:第三个案例线显示格式在模拟器上有问题,手机则没问题的,手机测试效果更佳)

布局:

<android.support.v7.widget.RecyclerViewandroid:id="@+id/my_recycler_view"android:scrollbars="vertical"android:layout_width="match_parent"android:layout_height="match_parent"/>

Activity:

public class RecyclerViewActivity extends Activity {private RecyclerView recyclerView;private List<String> mDatas;private RecyclerAdapter1 adapter;@SuppressLint("InlinedApi")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.demo1);initData();initView();}private void initView(){recyclerView=(RecyclerView) findViewById(R.id.demo1_recycler);// 设置布局管理LayoutManagerLinearLayoutManager manager=new LinearLayoutManager(this);//设置水平或者垂直// manager.setOrientation(LinearLayoutManager.HORIZONTAL);recyclerView.setLayoutManager(manager);// (可选)如果可以确定每个item的高度是固定的,设置这个选项可以提高性能recyclerView.setHasFixedSize(true);adapter=new RecyclerAdapter1(this,mDatas);recyclerView.setAdapter(adapter);adapter.setOnItemClickListener(new IOnClickListenter() {@Overridepublic void onItemClick(View view, int position) {Toast.makeText(getApplicationContext(),position+"---"+mDatas.get(position),Toast.LENGTH_LONG).show();}});}private void initData() {mDatas = new ArrayList<String>();for (int i = 0; i <= 50; i++) {mDatas.add("item---" +i);}}}

Adapter:

public class RecyclerAdapter1 extends RecyclerView.Adapter<RecyclerAdapter1.ViewHolder>{private Context context;private List<String> list;public RecyclerAdapter1(Context context, List<String> list){this.context=context;this.list=list;}@Overridepublic ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view= LayoutInflater.from(context).inflate(R.layout.demo1_item,parent,false);ViewHolder viewHolder=new ViewHolder(view);return viewHolder;}@Overridepublic void onBindViewHolder(ViewHolder holder, int position) {holder.textView.setText(list.get(position));}@Overridepublic int getItemCount() {return list.size();}private IOnClickListenter onClickListenter=null;public void setOnItemClickListener(IOnClickListenter listener){this.onClickListenter=listener;}public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{private TextView textView;public ViewHolder(View view){super(view);textView=(TextView)view.findViewById(R.id.textview1);textView.setOnClickListener(this);}@Overridepublic void onClick(View v) {if (onClickListenter != null) {onClickListenter.onItemClick(v,getPosition());}}}
}

上拉刷新下拉加载布局

<android.support.v4.widget.SwipeRefreshLayoutandroid:id="@+id/swipeRefreshLayout"android:layout_width="match_parent"android:layout_height="match_parent"><android.support.v7.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"></android.support.v7.widget.RecyclerView></android.support.v4.widget.SwipeRefreshLayout>

上拉刷新下拉加载Activity

public class RecyclerViewPullActivity extends Activity {private SwipeRefreshLayout swipeRefreshLayout;private MyRefreshRecyclerView recyclerView;public static  List<String> list=new ArrayList<String>();private RecyclerAdapter2 adapter;private Handler mHandler = new Handler();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.demo2);initView();}private void initView(){swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_layout);recyclerView = (MyRefreshRecyclerView) findViewById(R.id.recycler);adapter=new RecyclerAdapter2();recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));swipeRefreshLayout.setColorSchemeResources(R.color.blue,R.color.green);swipeRefreshLayout.post(new Runnable() {@Overridepublic void run() {swipeRefreshLayout.setRefreshing(true);}});mHandler.postDelayed(new Runnable() {@Overridepublic void run() {getData();recyclerView.setAdapter(adapter);adapter.notifyDataSetChanged();swipeRefreshLayout.setRefreshing(false);}},1500);swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {@Overridepublic void onRefresh() {mHandler.postDelayed(new Runnable() {@Overridepublic void run() {getData();recyclerView.setAdapter(adapter);adapter.notifyDataSetChanged();swipeRefreshLayout.setRefreshing(false);}}, 1500);}});recyclerView.setMyRefreshRecyclerViewListener(new MyRefreshRecyclerView.MyRefreshRecyclerViewListener() {@Overridepublic void onLoadMore() {mHandler.postDelayed(new Runnable() {@Overridepublic void run() {if (list.size() > 14) {recyclerView.setLoadMore(true);} else {int randomInt = new Random().nextInt(100);list.add("上拉加载添加数字:" + randomInt);adapter.notifyDataSetChanged();recyclerView.setLoadMore(false);}}}, 1000);}});}private void getData() {list.clear();Random random = new Random();while (list.size() < 12) {int randomInt = random.nextInt(100);list.add(String.valueOf(randomInt));}}
}

AS添加依赖库:

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

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

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

源码点击下载

转载于:https://my.oschina.net/zhangqie/blog/833522

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java——Arrays类操作数组的工具类

JDK中提供了一个专门用于操作数组的工具类&#xff0c;即 Arrays 类&#xff0c;位于 Java。util 包中。该类提供了一系列方法来操作数组&#xff0c;如排序、复制、比较、填充等&#xff0c;用户直接调用这些方法即可&#xff0c;不需要自己编码实现&#xff0c;降低了开发难度…

CORS——跨域请求那些事儿

【本期嘉宾介绍】睿得&#xff0c;具有多年研发、运维、安全等IT相关从业经历。目前从事CDN、存储、视频直播点播的技术支持。喜爱钻研&#xff0c;喜爱编码&#xff0c;喜爱分享。 在日常的项目开发时会不可避免的需要进行跨域操作&#xff0c;而在实际进行跨域请求时&#xf…

oracle 数据执行计划,Oracle里常见的执行计划

本文介绍了Oracle数据库里常见的执行计划&#xff0c;使用的Oracle数据库版本为11.2.0.1。1、与表访问相关的执行计划Oracle数据库里与表访问有关的两种方法&#xff1a;全表扫描和ROWID扫描。反映在执行计划上&#xff0c;与全表扫描对应的执行计划中的关键字是“TABLE ACCESS…

.NET MAUI实战 Dispatcher

详细内容这一期分享的内容非常简单&#xff0c;在之前使用过WPF的开发者对MVVM开发模式下ViewModel中后台线程转UI线程并不陌生使用Appplication.Current.Dispatcher。那么在.NET MAUI中也有同样的机制&#xff0c;存在于.NET MAUI Shell对象中。那么什么是Shell&#xff1f;官…

GDB 配置

GDB 配置 使用 GDB 扩展来配置 GDB 事实上我还是觉得原生的 GDB 就挺好&#xff0c;速度快&#xff0c;需要查看什么执行命令就可以。 GDB DashBoard https://github.com/cyrus-and/gdb-dashboard $sudo mkdir -m 777 ~/gdbinit; cd ~/gdbinit $git clone https://github.com/c…

Oracle区分中文和英文,oracle中中英文段落划分实现

oracle中关于中文占用字节数&#xff0c;不同的数据库有不同的情况&#xff0c;有的占用两个字节、有的占用三个字节&#xff0c;现在测试环境的数据库中文占用三个字节&#xff0c;要实现由中英文组成的段落字符串&#xff0c;按照每行占用多少字节重新分段&#xff0c;具体应…

虚拟机网络配置详解(NAT、桥接、Hostonly)

VirtualBox中有四种网络连接方式: NATBridged AdapterInternalHost-only AdapterVMWare中有三种&#xff0c;其实它跟VMWare的网络连接方式都是一样的概念&#xff0c;只是比VMWare多了Internal方式 在介绍四种工作模式之前&#xff0c;先说下虚拟网卡&#xff0c;虚拟机安装好…

微软宣布正式开源 Azure IoT Edge 边缘计算服务

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; 微软宣布&#xff0c;去年年底公开预览的 Azure IoT Edge 边缘计算服务已进入官方版&#xff0c;并通过 GitHub 将其开源。Azure IoT Edge 主要将基于云的分析和定制的业务逻辑转移到边缘设备&a…

Windows下安装BeautifulSoup

电脑首先要安装好了python&#xff0c;我安装的是2.7。 下面就是bs4的安装过程了: 1.去官网下载BeautifulSoup4 2017.02.10目前最新版本&#xff1a;Beautiful Soup 4.3.2 2.解压文件 将下载得到的压缩包解压到任意文件夹&#xff0c;路径不含中文 3.打开cmd命令提示符 winr&am…

BZOJ1578: [Usaco2009 Feb]Stock Market 股票市场

S<50只股票D<10天的价格给出&#xff0c;求第一天开始用n<200000元最后能得到的最大钱数&#xff0c;保证答案<500000。 做D次完全背包即可&#xff0c;每次做完把dp数组清空。 1 #include<cstdio>2 #include<cstring>3 #include<algorithm>4 #i…

OC如何跳到系统设置里的各种设置界面

当 iOS系统版本 < iOS7时 , 只能跳转到 系统设置页面 &#xff0c;楼主试了下&#xff0c;非真机是没有任何效果的 当iOS系统版本 < iOS 10.0 时 NSURL *url [NSURL URLWithString:"prefs:rootLOCATION_SERVICES"]; if( [[UIApplication sharedApplication]can…

虚拟DOM Diff算法解析

React中最神奇的部分莫过于虚拟DOM&#xff0c;以及其高效的Diff算法。这让我们可以无需担心性能问题而”毫无顾忌”的随时“刷新”整个页面&#xff0c;由虚拟DOM来确保只对界面上真正变化的部分进行实际的DOM操作。React在这一部分已经做到足够透明&#xff0c;在实际开发中我…

Azure 跨订阅迁移资源踩坑记

突然收到微软的邮件&#xff0c;提示我的一个 Azure 订阅已经到期&#xff0c;所以转为“禁用”状态&#xff0c;只能进行数据的导出和处理。在这个订阅里有不少较重要的资源在跑&#xff0c;直接关了可不行…于是开启了一个支持事件&#xff0c;台湾美眉的态度和声线真的没话说…

《ASP.NET Core 6框架揭秘》实例演示[25]:配置与承载环境的应用

与服务注册一样&#xff0c;针对配置的设置同样可以采用三种不同的编程模式。第一种是利用WebApplicationBuilder的Host属性返回的IHostBuilder对象&#xff0c;它可以帮助我们设置面向宿主和应用的配置。IWebHostBuilder接口上面同样提供了一系列用来对配置进行设置的方法&…

Linux日志出现大量kernel: NET: Registered protocol family 36

一台Linux服务器的系统错误日志出现大量的“ kernel: NET: Registered protocol family 36”错误信息&#xff0c;如下所示&#xff1a; Jul 2 05:27:45 xxxxxx kernel: NET: Registered protocol family 36Jul 2 05:27:45 xxxxxx kernel: NET: Unregistered protocol family…

node的模块机制

Node.js模块的实现 之前在网上查阅了许多介绍Node.js的文章&#xff0c;可惜对于Node.js的模块机制大都着墨不多。在后续介绍模块的使用之前&#xff0c;我认为有必要深入一下Node.js的模块机制。 CommonJS规范 早在Netscape诞生不久后&#xff0c;JavaScript就一直在探索本地编…

httpstat:一个检查网站性能的 curl 统计分析工具

httpstat&#xff1a;一个检查网站性能的 curl 统计分析工具httpstat 是一个 Python 脚本&#xff0c;它以美妙妥善的方式反映了 curl 统计分析&#xff0c;它是一个单一脚本&#xff0c;兼容 Python 3 &#xff0c;在用户的系统上不需要安装额外的软件(依赖)。作者&#xff1a…

关于面试中看到一些问题

最近公司在招聘.NET开发人员&#xff0c;面试了一些人&#xff0c;有一些感悟&#xff0c;分享出来&#xff0c;以供参考。面试的人员中&#xff0c;有一些是三五年的开发人员&#xff1b;也有几个是10年左右的技术负责人&#xff0c;不但自己架构过项目&#xff0c;还有带领导…

一个countDown在多线程调度下使用不当的分享

2019独角兽企业重金招聘Python工程师标准>>> 一个countDown在多线程调度下使用不当的分享 1. 诡异的数据抖动 在一个需求开发过程中&#xff0c;由于有多角色需要获取每个角色下的菜单&#xff1b;结果出现了单角色下拉去菜单没问题&#xff0c;多角色情况下只有一个…

linux脚本打印循环次数,shell脚本编程基础(3)——循环用法

本节索引&#xff1a;一、if、case条件判断二、for、while及until循环三、循环控制语句continue、break、shift及select菜单四、信号捕捉trap在前面的基础编程内容中&#xff0c;我们已经学习了shell脚本的顺序执行及选择执行&#xff0c;通过这两种方式&#xff0c;可以帮我们…