前言
刚刚公司开了一个“SQLServer性能调优,实操经验分享“的简短的培训会议,对于我来说真的是差点睡着了,主要是昨天太迟睡了吧,嗨,说好的合理安排作息时间。。。好了,废话不多说,正好提提神,我们一起来看看RecyclerView的使用吧,这个空间使用价值还是非常大的,我觉得应该较好的掌握。RecyclerView的一出现就引起了大量的关注,他梦幻般的效果让ListView和GridView等感到了深深的危机感。
简介
先简单说一下RecyclerView是什么吧,他是在support-v7包中提供的一个控件,根据官方的介绍呢,大致就是说可以在一个有限的布局中显示大量的数据,就类似于ListView和GridView吧。那么问题来了,为啥明明有了类似的控件又要重新来一个RecyclerView呢,第三方的PullToRefresn框架也是用起来极好的。
其实整体上看RecyclerView,是提供了一种插拔式的体验,它提供设置不同的LayoutManager,ItemDecoration , ItemAnimator能组合出非常惊人的效果,应该说实现了高度解耦。
使用方法
首先我们需要了解,和ListView比较,使用可能变得更加复杂一点,对于ListView的使用我就不多说了,就设置一个Adapter就可以搞定,那么RecyclerView的使用需要以下几步:
- 得到RecyclerView对象
- 设置布局管理器
setLayoutManager(layout); - 设置Adapter
setAdapter(adapter); - 设置item的动画效果(这个效果不错哦,可选)
setItemAnimator(new DefaultItemAnimator()) - 设置分隔线(坑爹了,竟然要自己设置分隔线,可选)
addItemDecoration(RecyclerView.ItemDecoration decor);
实战
接下来我们就来看看最简单的RecyclerView的使用方法吧。
具体说明我都写在注释里面了
首先是Activity:
package com.mic.blin.myrecyclerview;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.ArrayList;
public class MainActivity extends Activity {
private ArrayList<String> data;
private RecyclerView recyhclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
//找到RecycleView对象
recyhclerView = (RecyclerView) findViewById(R.id.recycleView);
//设置布局管理器
recyhclerView.setLayoutManager(new LinearLayoutManager(this));
//设置Adapter
recyhclerView.setAdapter(new MyRecyclerAdapter());
}
/**
*初始化数据源
**/
private void initData(){
data = new ArrayList<String>();
for(int i = 0;i<100;i++){
data.add("blin item :"+i);
}
}
/**
*和ListView一样,需要一个Adapter继承RecyclerView.Adapter
*需要说明的几点是:
*1.ListView中我们重用ViewHolder是后面定义一个内部类实现的,这里需要一开始传入
*即:RecyclerView.Adapter<MyRecyclerAdapter.MyViewHolder>,当然也是内部类。
*2.这样做的好处就是官方已经帮我们解决了重用的问题,我们只需提供重用的这个东西,系统会自己去调用。
*3.当然这个时候你的ViewHolder就不能随便自己乱来了,需继承官方提供的RecyclerView.ViewHolder
*4.这边需要实现3个重写方法:
* 4.1 onCreateViewHolder(ViewGroup parent, int viewType)就是返回一下重用的布局而已
* 4.2 onBindViewHolder(MyViewHolder holder, int position)这边就是用来绑定数据的
* 4.3 getItemCount() 这个没什么好说的
**/
class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewHolder>{
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
MyViewHolder viewHolder =
new MyViewHolder(LayoutInflater.from(MainActivity.this).inflate(
R.layout.content_main,parent,false));
return viewHolder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.tv.setText(data.get(position));
}
@Override
public int getItemCount() {
return data.size();
}
/**
*印证上面所说的,这边定义的内部类MyViewHolder需要继承RecyclerView.ViewHolder,
*这样才能为系统所重用。
**/
class MyViewHolder extends RecyclerView.ViewHolder{
public TextView tv;
public MyViewHolder(View itemView) {
super(itemView);
/**
*初始化item里面的控件
*/
tv = (TextView) itemView.findViewById(R.id.textView);
}
}
}
}
然后是布局文件:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<android.support.v7.widget.RecyclerView
android:id="@+id/recycleView"
android:layout_height="match_parent"
android:layout_width="match_parent">
</android.support.v7.widget.RecyclerView>
</RelativeLayout>
最后是item布局:content_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/textView"
android:gravity="center"
android:textSize="20sp"
android:padding="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
就这么简单,最简单的使用就是这样,然后跑起来看一下:
总结
跑起来后是不是发现很坑爹,竟然没有分隔线。。。其实吧,我建议的官方最好能够提供几个简单的,当然既然能自己加,那就充分证实了其功能的强大。
总结几点使用的方法:
- 使用方法其实很简单,就比ListView多了2步,当然多的步骤就是灵活性的体现,会在后期说明。
- 在继承RecyclerView.Adapter的时候需要注意要直接提供一个MyRecyclerAdapter.MyViewHolder,所以你得先在里面写一个内部类继承RecyclerView.ViewHolder。
- 做第2步的好处就是直接重用了item布局,相比ListView要求更高了。
- 4.
今天也就这么点时间,就简单的和大家介绍一下RecyclerView的最基本的用法,当然RecyclerView的功能远远的不仅于此,其他我会在接下来的博客中更新,未完待续。。。
PS
又是周五了,你们懂得^_^
博文中的代码会在RecyclerView控件更新完后给出总的代码下载链接Android RecyclerView 梦幻般的控件 使用解析(三)