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照片输出 突发拍摄模式 制约拍照速度的不再是软件而 ...
随机推荐
- struts2 自定义拦截,防止非法操作
<package name="defaults" extends="struts-default"> <interceptors> &l ...
- JS如何封装一些列方法为一个对象的操作,然后集中管理这些操作,方便修改和调用
var Api = { ajax:{ // 添加项目 旧! add_project : function(pro_name, html, css, js,callback) { $.post(&quo ...
- c# 前端写代码的情况
<%for(int i=0;i<list_model.Count;i++) { %> <div style=" padding-left:35px;padding-r ...
- C#中的static静态变量的用法
静态全局变量 定义:在全局变量前,加上关键字 static 该变量就被定义成为了一个静态全局变量. 特点: A.该变量在全局数据区分配内存. B.初始化:如果不显式初始化,那么将被隐式初始化为0. 静 ...
- 转之农民伯伯 IHttpHandler中使用Session实现原理[ASP.NET | IHttpHandler |IRequiresSessionState]
前言 在实现自己的Handler的时候只需要继承IHttpHandler接口就行了,在Handler中使用Session时,只需要继承一下IRequiresSessionState就行了,到底为什么只 ...
- jquery 中$('.ui-selecter',this)这样写 是什么意思 求解释 见到都是这种$("div")
如果用$("div")是拿选择所有的div$('.ui-selecter',this)选择的是现在选项中的child里面class是ui-selecter的意思跟jQuery(th ...
- cocos2d-x Android 环境搭建问题汇总
初次接触Cocos2d-x,准备搭建一个hello world的Android环境,问题遇到很多.在此记录,为自己,也为大家,避免重走弯路! 具体的环境搭建,可以参考官方的文档.在Windows7平台 ...
- php之工厂模式
工厂类是指包含一个专门用来创建其他对象的方法的类,工厂类在多态性编程实践中是至关重要的,它允许动态的替换类,修改配置,通常会使应用程序更加灵活,熟练掌握工厂模式高级PHP开发人员是很重要的. 工厂模式 ...
- eclipse下使用Genymotion调试Android程序出现的问题
一. The connection to adb is down, and a severe error has occured. You must restart adb and Eclipse. ...
- JavaScript学习总结【9】、DOM Ready
1.DOM DOM(Document Object Model)即文档对象模型,是从文档中抽象出来的,DOM 操作的对象就是文档,DOM 将 HTML 文档呈现为带有元素.属性和文本的树结构,即节点树 ...