简介
RecyclerView是从Android 5.0开始,谷歌公司推出的一个用于大量数据展示的心控件,在一定程度上可以代替
传统的ListView,更强大,更灵活
RecyclerView是v7包中的新组件,是一个强大的滑动组件,与经典的ListView相比,同样拥有Item的的回收复用功能,.
RecyclerView的优势:
RecyclerView并不能完全替代ListView,两者的使用场景不一样,相比于Lisetview的优点:
1.RecyclerView封装了Viewholder的回收复用,也就是说RecyclerView标准化了Viewholder,编写Adapter面向的是Viewholder而不是View.
2.提供了一种插拔式的体验,高度的解耦,异常的灵活,针对一个Item的显示RecyclerView专门抽取出了相应的类,来控制Item的显示,使其的扩展性非常强。
3.设置布局管理器以控制Item的布局方式,横向、竖向以及瀑布流方式
例如:你想控制横向或者纵向滑动列表效果可以通过LinearLayoutManager这个类来进行控制(与GridView效果对应的是GridLayoutManager,与瀑布流对应的还StaggeredGridLayoutManager等)。也就是说RecyclerView不再拘泥于ListView的线性展示方式,它也可以实现GridView的效果等多种效果。
4.可设置Item的间隔样式(可绘制)
通过继承RecyclerView的ItemDecoration这个类,然后针对自己的业务需求去书写代码。
5.可以控制Item增删的动画,可以通过ItemAnimator这个类进行控制,当然针对增删的动画,RecyclerView有其自己默认的实现。
但是关于item的点击和长按事件,需要用户自己取实现
基本使用:
导入依赖
implementation 'com.android.support:recyclerview-v7:28.0.0'
recyclerView = (RecyclerView) findViewById(R.id.recyclerView); LinearLayoutManager layoutManager = new LinearLayoutManager(this ); //设置布局管理器 recyclerView.setLayoutManager(layoutManager); //设置为垂直布局,这也是默认的 layoutManager.setOrientation(OrientationHelper. VERTICAL); //设置Adapter recyclerView.setAdapter(recycleAdapter); //设置分隔线 recyclerView.addItemDecoration( new DividerGridItemDecoration(this )); //设置增加或删除条目的动画 recyclerView.setItemAnimator( new DefaultItemAnimator());
在使用RecyclerView的时候,必须指定一个适配器和一个布局管理器
适配器Apdater继承RecyclerView.Adapter类
RecyclerView.Adapter<VH>
的Adapter类(VH是ViewHolder的类名)RecyclerView.ViewHolder实现方式基本与lisetview一样
package com.hejun.movie; import android.content.Context; import android.content.Intent; import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.RatingBar; import android.widget.TextView; import com.bumptech.glide.Glide; import com.orhanobut.logger.Logger; import java.io.Serializable; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; class GridAdapter extends RecyclerView.Adapter<GridAdapter.ViewHolder> { private Context context; private List<JsonBean.MoviesBean> list; public GridAdapter(Context context, List<JsonBean.MoviesBean> list) { this.context = context; this.list = list; } /** * 加载item布局 * @param viewGroup * @param i * @return */ @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { View view = LayoutInflater.from(context).inflate(R.layout.griditem, viewGroup, false); return new ViewHolder(view); } /** * 加载数据 * @param viewHolder * @param i */ @Override public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) { final JsonBean.MoviesBean moviesBean = list.get(i); Glide.with(context).load(moviesBean.getImageUrl()).into(viewHolder.imag); viewHolder.itemText.setText(moviesBean.getTitle()); viewHolder.stars.setRating((float) (moviesBean.getRating().getAverage() / 2)); viewHolder.itemText2.setText(String.valueOf(moviesBean.getRating().getAverage())); // Logger.v(String.valueOf((float) moviesBean.getRating().getAverage() / 2)); //设置item点击事件 viewHolder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //todo: 跳转详情页面 Intent intent = new Intent(context,DetailsActivity.class); intent.putExtra("movies", moviesBean); context.startActivity(intent); } }); } /** * 获取item数量 * @return */ @Override public int getItemCount() { return list.size(); } /** * 自定义ViewHolder */ static class ViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.imag) ImageView imag; @BindView(R.id.item_text) TextView itemText; @BindView(R.id.stars) RatingBar stars; @BindView(R.id.item_text2) TextView itemText2; ViewHolder(@NonNull View itemView) { super(itemView); ButterKnife.bind(this, itemView); } } }
LayoutManager 布局管理器
RecyclerView提供了三种布局管理器:
- LinerLayoutManager 以垂直或者水平列表方式展示Item
- GridLayoutManager 以网格方式展示Item
- StaggeredGridLayoutManager 以瀑布流方式展示Item
LayoutManager常见API
canScrollHorizontally();//能否横向滚动 canScrollVertically();//能否纵向滚动 scrollToPosition(int position);//滚动到指定位置 setOrientation(int orientation);//设置滚动的方向 getOrientation();//获取滚动方向 findViewByPosition(int position);//获取指定位置的Item View findFirstCompletelyVisibleItemPosition();//获取第一个完全可见的Item位置 findFirstVisibleItemPosition();//获取第一个可见Item的位置 findLastCompletelyVisibleItemPosition();//获取最后一个完全可见的Item位置 findLastVisibleItemPosition();//获取最后一个可见Item的位置