一.概述
RecyclerView是自Android 5.0之后,谷歌公司推出的控件。根据官方的介绍RecylerView是ListView的升级版。RecylerView是support-v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能。因此,当我们使用RcyclerView控件的时候,需要导入support-v7包。
二.RecyclerView的特性:
1.RecylerView封装了viewholder的回收复用,也就是说RecylerView标准化了ViewHolder,编写Adapter面向的是不再是View ,而直接是ViewHolder,封装了逻辑,使用起来更加简单。
2.提供了一种插拔式的体验,高度的解耦,异常的灵活,扩展了对Item的控制。对于不同的列表展示效果我们可以通过布局管理器LayoutManager。例如:你想控制横向或者纵向滑动列表效果可以通过LinearLayoutManager这个类来进行控制(与GridView效果对应的是GridLayoutManager,与瀑布流对应的还有StaggeredGridLayoutManager等)。
3.你想要控制Item间的间隔(可绘制),通过ItemDecoration。你想要控制Item增删的动画,通过ItemAnimator。
三.通过菜单栏的方式展示列表:
首先我们需要明白的一点是使用RecylerView必须导入support-v7包:
第一步:ctrl+shift+alt+s:
第二步:
测试xml是否成功导入
第三步:
在 MainActivity中的代码:
首先实例化 mRecyclerView = (RecyclerView) findViewById(R.id.recycler_View);
1:加载一个菜单的布局和RecyclerView没有关系,方便RcyclerView各种效果的展示
menu布局:
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_list"
android:orderInCategory="100"
android:title="list显示"
app:showAsAction="never"
>
<menu>
<item
android:id="@+id/action_list_noraml"
android:orderInCategory="100"
android:title="标准展示"
app:showAsAction="never"
/>
<item
android:id="@+id/action_list_vertical_reverse"
android:orderInCategory="100"
android:title="垂直反向"
app:showAsAction="never"
/>
<item
android:id="@+id/action_list_horizontal"
android:orderInCategory="100"
android:title="水平"
app:showAsAction="never"
/>
<item
android:id="@+id/action_list_horizontal_reverse"
android:orderInCategory="100"
android:title="水平反向"
app:showAsAction="never"
/>
</menu>
</item>
这里我们给菜单按钮做个监听:
为了使代码具有简洁性,我们把要填充的数据做了个loadListData( );
自定义的Bean类:
// Bean类该有哪些类型, 根据RecyclerView的item需要哪些数据决定
public class DataBean {
// 图片
public int icon;
// 文本
public String name;
}
我们自定义的适配器:
// RecyclerView的适配器,注意要指定泛型,一般我们就是类名的viewholder继承viewHolder(内部已经实现了复用优化机制)
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ListViewHolder>{
private Context mContext;
// 泛型是RecyclerView所需的bean类
private List<DataBean>mDataBeen;
// 构造方法(一般用于初始化数据),一般需要接受两个参数,上下文,集合对象(包含了我们所需要的数据)
public RecyclerViewAdapter(Context context, List<DataBean> dataBeen) {
mContext = context;
mDataBeen = dataBeen;
}
// 创建ViewHolder也就是创建出来一条ViewHolder(相当于listview中的item),并把viewHolder返回出去
@Override
public ListViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// 转换一个view布局对象,决定了item的样子,参数:1.上下文 2.xml布局资源 3. 位null
View itemView = View.inflate(mContext, R.layout.item_list, null);
// 创建一个viewHolder对象
ListViewHolder listViewHolder = new ListViewHolder(itemView);
// 把 ViewHolder传出去
return listViewHolder;
}
// 当ViewHolder和数据绑定时回调
@Override
public void onBindViewHolder(ListViewHolder holder, int position) {
// 从集合里拿对应item的数据对象
DataBean dataBean = mDataBeen.get(position);
// 给holder里面的控件对象设置数据
holder.setData(dataBean);
}
// 决定RecyclerView有多少条 item
@Override
public int getItemCount() {
// 数据不为null,有几条就显示几条
if (mDataBeen!=null &&mDataBeen.size()>0){
return mDataBeen.size();
}
return 0;
}
// 自动帮我们写的ViewHolder,参数:view布局对象
public class ListViewHolder extends RecyclerView.ViewHolder{
private final ImageView mIvIcon;
private final TextView mTvName;
public ListViewHolder(View itemView) {
super(itemView);
mIvIcon = (ImageView) itemView.findViewById(R.id.item_list_iv_icon);
mTvName = (TextView)itemView.findViewById(R.id.item_list_tv_name);
}
public void setData(DataBean data) {
// 给imageView设置图片数据
mIvIcon.setImageResource(data.icon);
// 给Textview设置文本数据
mTvName.setText(data.name);
}
}
}
最后还是要展示一下效果: