RecyclerView是support:recyclerview-v7中提供的控件,最低兼容到android 3.0版本。
官方介绍RecyclerView为在有限的窗口展现大量数据的控件。拥有类似功能的控件有ListView、GridView以及被Google遗弃的Gallery等,为毛已经有了它们,Google还推出RecyclerView呢,那就要说说RecyclerView所具有的一些优势了。
那RecyclerView到底有啥优势呢?总结起来六颗字:低耦合高类聚。RecyclerView已经标准化ViewHolder,我们自定义的ViewHoler需要继承 RecyclerView.ViewHolder,然后在构造方法中初始化控件,后面会有具体介绍。通过设置不同的LayoutManager,以及结合ItemDecoration , ItemAnimator,ItemTouchHelper,可以实现非常炫酷的效果,这些是ListView等控件难以企及的。
首先第一步,用这个当然是先要倒入依赖
implementation 'com.android.support:recyclerview-v7:28.0.0'
然后在xml中写自己的布局
<android.support.v7.widget.RecyclerView
android:id="@+id/recycyle"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
然后呢就开始操作了,在写适配器之前还要设置几个属性
第一个是布局样式(线性,网格,瀑布等)
LinearLayoutManager manager = new LinearLayoutManager(MainActivity.this);
manager.setOrientation(LinearLayoutManager.VERTICAL);
recycyle.setLayoutManager(manager);
这里以线性为例,还有GridLayoutManager和StaggeredGridLayoutManager
然后是给它添加横线Decoration
DividerItemDecoration decoration = new DividerItemDecoration(MainActivity.this, DividerItemDecoration.VERTICAL);
decoration.setDrawable(getDrawable(R.drawable.item_divider));
recycyle.addItemDecoration(decoration);
然后添加动画
DefaultItemAnimator animator = new DefaultItemAnimator();
animator.setRemoveDuration(200);
animator.setAddDuration(200);
recycyle.setItemAnimator(animator);
到这里设置的就差不多了,最后就是大工程
适配器
了,写法上稍有不同,这次是要重写三个方法,
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.RVolder> {
Context context;
ArrayList<Food> arr;
jiekou jie;
public MyAdapter(Context context, ArrayList<Food> arr) {
this.context = context;
this.arr = arr;
}
public void setJie(jiekou jie){
this.jie = jie;
}
public void addlist(ArrayList<Food> xxx){
notifyDataSetChanged();
}
public void remove(int index){
arr.remove(index);
notifyItemRemoved(index);
notifyItemRangeChanged(index,arr.size());
}
@Override
public RVolder onCreateViewHolder(ViewGroup viewGroup, int i) {
return new RVolder(LayoutInflater.from(context).inflate(R.layout.item_vh,viewGroup,false));
}
@Override
public void onBindViewHolder(@NonNull RVolder rVolder,final int i) {
rVolder.title.setText(arr.get(i).title);
rVolder.food_str.setText(arr.get(i).food_str);
Glide.with(context).load(arr.get(i).pic).into(rVolder.pic);
Log.i("###", "onBindViewHolder: 我到这里了");
}
@Override
public int getItemCount() {
return arr.size();
}
class RVolder extends RecyclerView.ViewHolder{
TextView title;
TextView food_str;
ImageView pic;
public RVolder(View itemView) {
super(itemView);
title = itemView.findViewById(R.id.title);
food_str = itemView.findViewById(R.id.food_str);
pic = itemView.findViewById(R.id.pic);
}
}
}
在这里主要是要注意自己写的ViewHolder要继承RecyclerView.ViewHolder
然后给他返回去,才能进行获取布局和添加事件,数据源自己封装好,动手试试吧