android5.0中RecycleView的用法
最近学习了android5.0中新增的一个组件RecycleView,是用来代替当前的listview开发的,是因为在RecycleView中已经有了viewholder缓存,并且不同的item之间可以设置不同的布局。能非常有效地维护了意见数量有限,滚动大的数据集。使用 RecyclerView当你拥有的数据的集合,它的元素在运行时改变基于用户行为和网络事件的小部件
首先看看RecyclerView的一个小例子:
需要引入:android-support-v7-appcompat.jar
android-v7-RecyclerView.jar来支持低版本的android系统
新建一个my_layout.xml布局文件:里边放置一个RecyclerView
- <android.support.v7.widget.RecyclerView
- android:id="@+id/rvlist"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:scrollbars="vertical"
- />
在之前的listview开发中,我们需要自定义viewholder来缓存listView中的数据,而在RecyclerView中,已经封装好了viewholder在adapter中,接下来自定义我们的adapter
- public class MyAdapter2 extends RecyclerView.Adapter<MyAdapter2.ViewHolder>
- {
- // 数据集
- private String[] mDataset;
- public MyAdapter2(String[] dataset)
- {
- super();
- mDataset = dataset;
- }
- @Override
- public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)
- {
- // 创建一个View,简单起见直接使用系统提供的布局,就是一个TextView
- View view = View.inflate(viewGroup.getContext(),R.layout.viewholder_item, null);
- // 创建一个ViewHolder
- ViewHolder holder = new ViewHolder(view);
- return holder;
- }
- @Override
- public void onBindViewHolder(ViewHolder viewHolder, int i)
- {
- // 绑定数据到ViewHolder上
- viewHolder.mTextView.setText(mDataset[i]);
- }
- @Override
- public int getItemCount()
- {
- return mDataset.length;
- }
- public static class ViewHolder extends RecyclerView.ViewHolder
- {
- public TextView mTextView;
- public ViewHolder(View itemView)
- {
- super(itemView);
- // mTextView = (TextView) itemView;
- mTextView = (TextView) itemView.findViewById(R.id.view_text_id);
- }
- }
- }
在activity这样调用,并设置adapter
- RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rvlist);
- // 创建一个线性布局管理器
- LinearLayoutManager layoutManager = new LinearLayoutManager(this);
- layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
- // 设置布局管理器
- recyclerView.setLayoutManager(layoutManager);
- // 创建数据集
- String[] dataset = new String[100];
- for (int i = 0; i < dataset.length; i++){
- dataset[i] = "item" + i;
- }
- // 创建Adapter,并指定数据集
- MyAdapter2 adapter = new MyAdapter2(dataset);
- // 设置Adapter
- recyclerView.setAdapter(adapter);
- }
运行效果:
在这个例子中只是用到了最基本的布局,下面结合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组件
- <android.support.v7.widget.CardView
- android:id="@+id/cardview_id"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- app:cardCornerRadius="5dp"
- app:cardElevation="0dp" >
- <RelativeLayout
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:padding="5dp" >
- <ImageView
- android:id="@+id/image_id"
- android:layout_width="20dp"
- android:layout_height="20dp"
- android:layout_alignParentLeft="true"
- />
- <TextView
- android:id="@+id/text_id"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:textColor="#f89ef5"
- android:textSize="20dp"
- android:layout_centerInParent="true" />
- </RelativeLayout>
- </android.support.v7.widget.CardView>
需要注意的是要在最底层的layout中引入cardview的命名空间:
xmlns:app=http://schemas.android.com/apk/res-auto
要实现不同的item有不同的布局,需要有一个type字段来作为区分,这里,我新建一个UserInfo类,如下:
- public class UserInfo {
- public static final int hasImage = 1;
- public static final int noImage = 2;
- private String mUserName;
- private int userImage;
- int type;
- public String getmUserName() {
- return mUserName;
- }
- public void setmUserName(String mUserName) {
- this.mUserName = mUserName;
- }
- public int getUserImage() {
- return userImage;
- }
- public void setUserImage(int userImage) {
- this.userImage = userImage;
- }
- public int getType() {
- return type;
- }
- public void setType(int type) {
- this.type = type;
- }
- public UserInfo(String mUserName, int type) {
- this.mUserName = mUserName;
- this.type = type;
- }
- public UserInfo(String mUserName, int userImage, int type) {
- this.mUserName = mUserName;
- this.userImage = userImage;
- this.type = type;
- }
- }
hasImage和noImage分别表示该item需不需要加载图片,来加载不同的布局。
接下来看看Adapter的代码:
- public class MyAdapter extends RecyclerView.Adapter<ViewHolder>{
- private List<UserInfo>mList = null;
- private Context context = null;
- public MyAdapter(List<UserInfo> mList, Context context) {
- super();
- this.mList = mList;
- this.context = context;
- // for (int i = 0; i < mList.size(); i++) {
- // Log.d("liuhang","==="+mList.get(i).getmUserName()+"==="+mList.get(i).getUserImage());
- // }
- }
- public void addToList(UserInfo info,int position) {
- mList.add(0, info);
- notifyItemInserted(position);
- notifyDataSetChanged();
- }
- public class TextOnClick implements OnClickListener {
- private int position = 0;
- public TextOnClick(int position) {
- this.position = position;
- }
- @Override
- public void onClick(View v) {
- Toast.makeText(context,"text the name:"+mList.get(position).getmUserName(),1000).show();
- }
- }
- public class ImageOnclick implements OnClickListener {
- private int position = 0;
- public ImageOnclick(int position) {
- this.position = position;
- }
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Toast.makeText(context,"image the imageId:"+mList.get(position).getUserImage(),1000).show();
- }
- }
- public class ItemOnClick implements OnItemClickListener {
- @Override
- public void onItemClick(AdapterViewCompat<?> arg0, View arg1, int arg2,
- long arg3) {
- // TODO Auto-generated method stub
- Toast.makeText(context,"you choose the item",1000).show();
- }
- }
- @Override
- public int getItemCount() {
- return mList.size();
- }
- public class TextViewHolder extends RecyclerView.ViewHolder {
- public TextView textView = null;
- public TextViewHolder(View view) {
- super(view);
- this.textView = (TextView) view.findViewById(R.id.text_id);
- }
- }
- public class ImageTextViewHolder extends RecyclerView.ViewHolder {
- public ImageView imageView = null;
- public TextView textView = null;
- public ImageTextViewHolder(View view) {
- super(view);
- this.imageView = (ImageView) view.findViewById(R.id.image_id);
- this.textView = (TextView) view.findViewById(R.id.text_id);
- }
- }
- @Override
- public int getItemViewType(int position) {
- // TODO Auto-generated method stub
- return mList.get(position).getType();
- }
- @Override
- public void onBindViewHolder(ViewHolder holder, int position) {
- switch (getItemViewType(position)) {
- case UserInfo.hasImage:
- ImageTextViewHolder imageTextViewHolder = (ImageTextViewHolder) holder;
- imageTextViewHolder.imageView.setImageResource(mList.get(position).getUserImage());
- imageTextViewHolder.textView.setText(mList.get(position).getmUserName());
- imageTextViewHolder.textView.setOnClickListener(new TextOnClick(position));
- imageTextViewHolder.imageView.setOnClickListener(new ImageOnclick(position));
- break;
- case UserInfo.noImage:
- TextViewHolder textViewHolder = (TextViewHolder) holder;
- textViewHolder.textView.setText(mList.get(position).getmUserName());
- textViewHolder.textView.setOnClickListener(new TextOnClick(position));
- }
- }
- @Override
- public ViewHolder onCreateViewHolder(ViewGroup parent, int type) {
- ViewHolder holder = null;
- View view = null;
- switch (type) {
- case UserInfo.hasImage:
- view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_text_image_item,null);
- holder = new ImageTextViewHolder(view);
- break;
- case UserInfo.noImage:
- view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_text_item,null);
- holder = new TextViewHolder(view);
- break;
- }
- <a target=_blank href="http://download.csdn.net/detail/mockingbirds/8312357">源码下载</a>
- return holder;
- }
- }
在activity中这样调用:
- RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_id);
- recyclerView.setHasFixedSize(true);
- LinearLayoutManager linaLayout = new LinearLayoutManager(this);
- linaLayout.setOrientation(1);
- recyclerView.setLayoutManager(linaLayout);
- recyclerView.getRecycledViewPool().setMaxRecycledViews(0, 10);
- int[]userImage = {R.drawable.icon08,R.drawable.icon00,R.drawable.icon01,
- R.drawable.icon02,R.drawable.icon03,R.drawable.icon04,
- R.drawable.icon05,R.drawable.icon06,R.drawable.icon07};
- List<UserInfo>userList = new ArrayList<UserInfo>();
- int position = 0;
- for (int i = 0; i < 35; i++) {
- position = (int) (Math.random() * 8);
- UserInfo userInfo1 = new UserInfo("zhangsan"+i,2);
- UserInfo userInfo2 = new UserInfo("lisi"+i,userImage[position],1);
- userList.add(userInfo1);
- userList.add(userInfo2);
- }
- final MyAdapter adapter= new MyAdapter(userList, this);
- recyclerView.setAdapter(adapter);
- recyclerView.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Toast.makeText(MyActivity.this,"you choose the item",1000).show();
- }
- });
- Button button = (Button) findViewById(R.id.add);
- button.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- adapter.addToList(new UserInfo("new add"+ newAdd++, 2),0);
- }
- });
android5.0中RecycleView的用法的更多相关文章
- 聊聊Android5.0中的水波纹效果
水波纹效果已经不是什么稀罕的东西了,用过5.0新控件的小伙伴都知道这个效果,可是如果使用一个TextView或者Button或者其它普通控件的话,你是否知道如何给它设置水波纹效果呢?OK,我们今天就来 ...
- 关于MVC4.0中@Styles.Render用法与详解
本文分享于http://keleyi.com/a/bjac/q74dybjc.htm文章,感觉写的蛮好所以就拿过来做笔记了,希望对大家有帮助 最近公司的新项目用了MVC 4.0,接下来一步步把 工作中 ...
- Android5.0中Material Design的新特性
最近项目中需要用到Material Design,整理了下面几个常用的控件,以便记忆. 一.Snackbar 1.作用:与Toast类似,但是可以点击监听: 2.使用: (1)Snackbar调用静态 ...
- iOS 9.0中UIAlertController的用法。
1.我为什么要写这篇博客记录它? 答:因为 UIAlertView和UIActionSheet 被划线了 苹果不推荐我们使用这两个类了,也不再进行维护和更新,为了以后方便使用我来记录一下.如图所示 正 ...
- iOS 9.0中UIAlertController的用法
UIAlertView和UIActionSheet 被划线了. 苹果不推荐我们使用这两个类了.也不再进行维护和更新 正如苹果所说它现在让我们用UIAlertConntroller 并设置样式为UIAl ...
- 一个Activity掌握Android5.0新控件 (转)
原文地址:http://blog.csdn.net/lavor_zl/article/details/51279386 谷歌在推出Android5.0的同时推出了一些新控件,Android5.0中最常 ...
- Android5.0新控件
谷歌在推出Android5.0的同时推出了一些新控件,Android5.0中最常用的新控件有下面5种. 1. CardView(卡片视图) CardView顾名思义是卡片视图,它继承FrameLay ...
- Android5.0 ListView特效的简单实现
Android5.0中对于动画可所谓是情有独钟,在设计规范中大量展现了listview的动画,其实也就是一个目的:将items动画显示出来.这个看起来很炫的效果,其实实现也蛮简单的,我下面就来用动画简 ...
- Android -- Camera2(Android5.0)
Camera2 Camera2是Android5.0中的其中一个新的特性,新的API.与原来的camera API相比,不同之处在于: 原生支持RAW照片输出 突发拍摄模式 制约拍照速度的不再是软件而 ...
随机推荐
- PLSQL Developer操作
1.设置 1)下载32位Oracle InstantClient 2)将Oracle InstantClient解压到某目录 3)设置环境变量(修改NLS_LANG和TNS_ADMIN环境变量)对 ...
- ArcGIS 设置地图显示范围大小
Arcmap的FullExtent默认是地图加载的时候的extent.其实这个fullExtent是可以设置的. 打开ArcMap,选择左边图例的Layers ,右键点击,选择“Properties. ...
- [网络] C# NetHelper网络通信编程类教程与源码下载
点击下载 NetHelper.zip 主要功能如下所示 检查设置的IP地址是否正确,返回正确的IP地址 检查设置的端口号是否正确,返回正确的端口号 将字符串形式的IP地址转换成IPAddress对象 ...
- 案例:latch: cache buffers chains event tuning
前两天对oracle数据库(single instance)进行了迁移升级从10.2.0.4 升到11.2.0.3,有一个项目迁完后第二天,cpu负载升到了130更高(16cpus). 向用户询问后使 ...
- 使用正则表达式统计vs项目代码总行数[转]
怎么统计VS2008中工程的总共代码行数?怎么统计VS2008中工程的总共代码行数?在一个大工程中有很多的源文件和头文件,我如何快速统计总行数? ------解决方案----------------- ...
- C# 虚方法 抽象方法 接口
虚方法:virtu 注意的几点: 1,父类中如果有方法让子类重写,则可以将该方法标记为virtual 2.虚方法在父类中必须有实现,哪怕是空实现 3虚方法子类可以重写,也可以不重写 4.如果类是抽象类 ...
- C++自定义异常处理
自定义异常类 class MyException { public: MyException() { } MyException(char* str) { msg = str; } MyExcepti ...
- a+b(高精度)[陈涛]——c语言
#include<stdio.h>#include<string.h>char s[1000];---------------------------------------- ...
- 速卖通---发布商品aeopAeProductPropertys这个字段值报07004013的错误
由于文档的说明很少,导致里面改填写那些值都是靠自己推敲出来,当然可以根据他们的错误提示了研究,他们的错误提示也给出了相关的帮助了, 例如通过categoryid的200000001获取到"i ...
- 如何禁用easyui-linkbutton 中的Click事件
eg: <a id="btn" href="#" class="easyui-linkbutton" data-options=&qu ...