对于RecyclerView,我想大家肯定也不陌生,毕竟已经发布很长时间了,本文是为了给小白入门用的,大神可忽略,文中错误或者表达不准确的地方还请各位不吝赐教。
一、AS中使用RecyclerView的准备工作
android studio中使用RecyclerView的准备工作其实很少,只需要一步即可:
File ——-> Project Structure ——-> app———> Dependencies ———> “+” ——->”Library Dependency” ——->搜索”com.android.support:recyclerview”然后选中搜到的那个库 ———>”OK” ———>”OK” 好了,让项目飞一会……
二、RecyclerView的使用
1.在布局文件layout中添加RecyclerView。
<android.support.v7.widget.RecyclerView android:id="@+id/recyclerView_shareAPKPackageLikeQQActivity"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
</android.support.v7.widget.RecyclerView>
2.在Activity中先找到RecyclerView,然后为其设置布局管理器
@ViewById(R.id.recyclerView_MainActivity)
protected RecyclerView recyclerView;
recyclerView.setLayoutManager(new LinearLayoutManager(context));
3.现在去创建一个继承自RecyclerView.Adapter的MyRecyclerViewAdapter类,先不要实现内部方法,然后在这个类中添加一个内部类MyViewHolder,
当然继承自RecyclerView.ViewHolder类
public class MyRecycleViewAdapter extends RecyclerView.Adapter<MyRecycleViewAdapter.MyViewHolder> {
private Context context;
private String[] itemText;
private int[] itemImg;
/**
* 构造方法
*
* @param context
* @param itemImg
* @param itemText
*/
public MyRecycleViewAdapter(Context context, int[] itemImg, String[] itemText) {
this.context = context;
this.itemImg = itemImg;
this.itemText = itemText;
}
/**
* @param parent
* @param viewType
* @return
*/
@Override
public MyViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
final View itemRoot = LayoutInflater.from(context).inflate(R.layout.recycleview_cell, parent, false);
MyViewHolder mViewHolder = new MyViewHolder(itemRoot);
return mViewHolder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.img.setImageDrawable(context.getResources().getDrawable(itemImg[position]));
holder.text.setText(itemText[position]);
}
@Override
public int getItemCount() {
return itemImg.length;
}
class MyViewHolder extends RecyclerView.ViewHolder {
ImageView img;
TextView text;
public MyViewHolder(View itemView) {
super(itemView);
img = (ImageView) itemView.findViewById(R.id.img_recycleView);
text = (TextView) itemView.findViewById(R.id.tv_recycleView);
}
}
}
4.在Activity中创建adapter的对象,然后为RecyclerView设置Adapter,完成。
// 设置适配器
mAdapter = new MyRecycleViewAdapter(context, itemImg, itemText);
recyclerView.setAdapter(mAdapter);
—————————————我是一条安静的分割线—————————————–
以上步骤做完,那么基本的RecyclerView就能够呈现在屏幕上了,但是有这么几点不舒服的地方:
1.点击item没有任何效果,分不清是点击了还是没有
2.需要为item添加点击事件,以便完成后续操作
3.如果我想要item多样式显示效果,我该怎么办呢?
对于问题1,我们可以写一个Drawable,来作为item的背景:
recyclerview_item_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<color android:color="#ff9a9a9a" />
</item>
<item android:state_pressed="false">
<color android:color="#00000000" />
</item>
</selector>
然后在Adapter类中的onCreateViewHolder方法中为itemRoot设置背景(只需要下面三行代码中的第三行即可):
final View itemRoot = LayoutInflater.from(context).inflate(R.layout.recycleview_cell, parent, false);
MyViewHolder mViewHolder = new MyViewHolder(itemRoot);
itemRoot.setBackground(context.getResources().getDrawable(R.drawable.recyclerview_item_bg));
这样,再点击item的时候你会发现item的背景颜色变化了。
对于问题2,请参考我的另一篇文章,“RecyclerView的item点击事件监听器”地址:http://blog.csdn.net/gxp1182893781/article/details/76736282
对于问题3,我们需要在Adapter类中重写getItemViewType方法:
@Override
public int getItemViewType(int position) {
return infos.get(position).getType();
}
这里的infos是想要展示的数据构成的Javabean,里面有一个域叫type,用来标识某个特定对象是什么类型的(比如,0表示样式0,1表示样式1…)
注意看,重写后直接让返回值返回了type,然后系统会把这个type传给onCreateViewHolder方法的第二个参数,这样我们就可以根据这个type的值去确定到底要使用哪一个item_cell布局文件了。
@Override
public MyListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
MyListViewHolder mViewHolder;
if (viewType == 0) {
mViewHolder = new MyListViewHolder(LayoutInflater.from(context).inflate(R.layout.childlist_cell_type0_share_apkpackage_like_qq, parent, false),viewType);
} else {
mViewHolder = new MyListViewHolder(LayoutInflater.from(context).inflate(R.layout.childlist_cell_type1_share_apkpackage_like_qq, parent, false),viewType);
}
return mViewHolder;
}
上面代码中,我们给MyListViewHolder类传入了这个type值,这样ViewHolder就能根据type正确的找到布局文件中的各个控件了。
public MyListViewHolder(View itemView,int viewType) {
super(itemView);
if (viewType == 0){
icon = itemView.findViewById(R.id.icon_type0_share_apkpackage_like_qq);
name = itemView.findViewById(R.id.name_type0_share_apkpackage_like_qq);
lastUpdateDate = itemView.findViewById(R.id.lastUpdateDate_type0_share_apkpackage_like_qq);
size = itemView.findViewById(R.id.sizePackage_type0_share_apkpackage_like_qq);
}else {
icon = itemView.findViewById(R.id.icon_type1_share_apkpackage_like_qq);
name = itemView.findViewById(R.id.name_type1_share_apkpackage_like_qq);
lastUpdateDate = itemView.findViewById(R.id.lastUpdateDate_type1_share_apkpackage_like_qq);
size = itemView.findViewById(R.id.sizePackage_type1_share_apkpackage_like_qq);
}
}
这样,在之后的onBindViewHolder中为item_cell布局中的各个组件设置显示内容就很轻松了。
通过以上方法,我们就实现了item的多样式显示功能。
最后,一个小注意事项给大家,希望能注意一下:
在ListView的item_cell布局文件中,我们可以随意让最外层布局的宽和高为match_parent或者wrap_content。因为实际在现实的时候会按照wrap_content进行显示,只有给定具体数值时才会按照给定的数值进行显示。
但是RecyclerView来说,如果item_cell的最外层布局的宽或高定义为wrap_content,那么他会像ListView一样正常显示,但是如果定位成match_parent,那么每一个item将要铺满整个父级容器,不会像ListView一样自适应宽高,当然,如果给定具体数值也会按照给定的数值进行显示。
因此,在使用Recyclerview的时候,个人建议,使用wrap_content。