RecyclerView?这是什么东西?这是Android中V7包提供的新视图!
作用和ListView,GridView都差不多,都是展现那种滑动的视图的。但是看他的名字,Recycler是回收站的意思,回收视图?对,你在使用ListView的时候,还在写if convertView == null 吗? RecyclerView的出现解决了你滑动视图的时候,不用考虑视图回收问题。他已经帮助你办完这件事了!
简单的说,RecyclerView不管视图长啥样,不管分隔线啥样,他只关注视图的回收问题。然后另提供了一些类,用这些类管理视图样式。这样耦合性非常的低,用法异常的灵活!
这里我用的是Android Studio,因为Eclipse的话会有不兼容的现象,还要从网上下载Jar包,导入,有点麻烦。下面说一下Android Studio怎么导入RecyclerView的
可以看出来,AndroidStudio导入是非常便捷的,而且不用担心版本不兼容的问题。下面就介绍使用方法
1.其实你学会了一种视图,其他的用法都是差不多的。首先要在主布局文件中添加这个视图
<!--activity_main.xml-->
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView_show"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</android.support.v7.widget.RecyclerView>
2.和ListView一样,你也需要在MainActivity里做一些中规中矩的操作。初始化视图,创建List集合,创建Adapter,setAdapter…,为了方便大家看,我就不封装到方法里了,没几行代码的玩意!
/*=====================MainActivity=====================*/
private RecyclerView mRecyclerView;//控件
private List<String> mList;//数据集
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView_show);
mList = new ArrayList<String>();
//初始化数据源
for(int x = 1; x <= 100; x++)
{
mList.add("item" + x);
}
//设置数据适配器
mRecyclerView.setAdapter(new MyAdapter(this,mList));
//设置布局管理器
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
}
这里你可能有两处疑问,第一就是MyAdapter的具体实现,第二就是mRecyclerView.setLayoutManager(…),其实刚才就说过了,这些显示和样式不归RecyclerView管,都是另有类来管理的,这里用的就是LinearLayoutManager对象来管理和设置布局,如果你不设置这句话,当然不会报错,只是什么都不会显示而已!
那在看一下MyAdapter
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>
{
private List<String> mList;
private Context mContext;
private LayoutInflater mInflater;
public MyAdapter(Context context,List<String> list)
{
this.mContext = context;
this.mList = list;
mInflater = LayoutInflater.from(context);
}
/**
* 见名知意,创建ViewHolder
* @param parent
* @param viewType
* @return
*/
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
View v = mInflater.inflate(R.layout.item_textview, parent, false);
MyViewHolder holder = new MyViewHolder(v);
return holder;
}
/**
* 绑定并设置ViewHolder
* @param holder
* @param position
*/
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.tv.setText(mList.get(position));
}
/**
* 这个方法大家都比较熟悉,和ListView中Adapter里的一样
* @return
*/
@Override
public int getItemCount()
{
return mList.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder
{
TextView tv;
/**
* 构造函数
* @param 'itemView参数:用于接受inflate的item视图'
*/
public MyViewHolder(View itemView)
{
super(itemView);
tv = (TextView)itemView.findViewById(R.id.textView_show);
}
}
}
解释一下上面的代码
这里的成员变量和构造函数就不解释了,和传统ListView都是一样的,还有inflater的布局里面就一个TextView。
这里继承的不是传统的BaseAdapter,而是RecyclerView提供的Adapter类,并且强制使用了泛型ViewHolder,而这里是创建你的数据适配器,所以泛型要放你的ViewHolder,于是就创建了一个MyViewHolder,继承了ViewHolder,里面的内容和传统的ListView中ViewHolder一样,只不过是分开写罢了!
那继承了RecyclerView.Adapter后,就需要重写父类的方法,可以看到一共有三个
getItemCount(),这个大家肯定很熟悉喽!
onCreateViewHolder()见名知意,创建ViewHolder
onBindViewHolder(),设置和绑定ViewHolder
这里将创建ViewHolder和设置绑定ViewHolder分为了两个函数。用的话也是比ListView中的Adapter爽的多啊,划分的很清楚啊!
=========================================
好了,你现在可以运行你的程序了!啊?连分隔线都没有,这么磕碜?加一个,于是你在你的RecyclerView里面打上了divider属性,可惜没屁用!一开始就说,RecyclerView只管视图的回收,长的磕碜好看那都是由别的对象来管理。这章就不具体说了,下一篇文章会介绍
ItemDecoration
ItemAnimator
特效,美观?呵呵,不在话下!
OK,第一章就分享到这里,这里只是先让你了解一些RecyclerView的基本概念和基本使用,如有疑问或意见,欢迎QQ骚扰:997797281!