关于RecyclerView
来源:互联网 发布:linux下怎样输入中文 编辑:程序博客网 时间:2024/05/21 06:18
1.概述:
RecyclerView的设计与ListView、GridView类似,也使用了Adapter,不过该Adapter并不是ListView中的Adapter,而是RecyclerView的一个静态内部类。该Adapter有一个泛型参数VH,代表的就是ViewHolder。RecyclerView还封装了一个ViewHolder类型,该类型中有一个itemView字段,代表的就是每一项数据的根视图,需要在构造函数中传递给ViewHolder对象。RecyclerView这么设计相当于将ListView的Adapter进行了再次封装,把getView函数中判断是否含有缓存的代码段封装到RecyclerView内部,使这部分逻辑对用户不可见。用户只需要告诉RecyclerView每项数据是怎么样的以及将数据绑定到每项数据上,分别对应的函数为onCreateViewHolder函数、onBindViewHolder函数,当然还需要通过getItemCount告诉RecyclerView有多少项数据,以往适用于ListView的 Adapter中的getView函数中的逻辑就不需要用户来处理了。
基本用法如下:
compile 'com.android.support:recyclerview-v7:25.3.1'
public class Fruit { private String name; private int imageId; public Fruit(String name,int imageId) { this.name = name; this.imageId = imageId; } public String getName() { return name; } public int getImageId() { return imageId; }}
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:id="@+id/fruit_image" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/fruit_name" android:layout_gravity="center_vertical" android:layout_marginLeft="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/></LinearLayout>
public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> { private List<Fruit> mFruLis; static class ViewHolder extends RecyclerView.ViewHolder { ImageView fruitImage; TextView fruitName; public ViewHolder(View vie) { super(vie); fruitImage = (ImageView) vie.findViewById(R.id.fruit_image); fruitName = (TextView) vie.findViewById(R.id.fruit_name); } } public FruitAdapter(List<Fruit> fruLis) { mFruLis = fruLis; } @Override public ViewHolder onCreateViewHolder(ViewGroup par,int vieTyp) { View vie = LayoutInflater.from(par.getContext()).inflate(R.layout.fruit_item,par,false); ViewHolder hol = new ViewHolder(vie); return hol; } @Override public void onBindViewHolder(ViewHolder hol,int pos) { Fruit fru = mFruLis.get(pos); hol.fruitImage.setImageResource(fru.getImageId()); hol.fruitName.setText(fru.getName()); } @Override public int getItemCount() { return mFruLis.size(); }}
<android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_height="match_parent" android:layout_width="match_parent" />
private List<Fruit> fruLis = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initFruits(); RecyclerView recVie = (RecyclerView) findViewById(R.id.recycler_view); LinearLayoutManager layMan = new LinearLayoutManager(this); recVie.setLayoutManager(layMan); FruitAdapter ada = new FruitAdapter(fruLis); recVie.setAdapter(ada);}private void initFruits() { for(int i=0;i<3;i++) { Fruit at = new Fruit("apple",R.drawable.at); fruLis.add(at); Fruit camera = new Fruit("apple",R.drawable.camera); fruLis.add(camera); Fruit clock = new Fruit("apple",R.drawable.clock); fruLis.add(clock); Fruit movie = new Fruit("apple",R.drawable.movie); fruLis.add(movie); Fruit music = new Fruit("apple",R.drawable.music); fruLis.add(music); Fruit right = new Fruit("apple",R.drawable.right); fruLis.add(right); }}
2.高级用法
RecyclerView的另一大特点就是将布局方式抽象为LayoutManager,默认提供了LinearLayoutManager、GridLayoutManager、StaggeredGridLayoutManager 3种布局,对应为线性布局、网格布局、交错网格布局,如果这些都无法满足你的需求,你还可以定制布局管理器实现特定的布局方式。
RecyclerView通过桥接的方式将布局职责抽离出去,使得RecyclerView变得更灵活。例如,如果用户只需要修改RecyclerView的布局方式,只需要修改LayoutManager即可,而不需要操作复杂的RecyclerView类型。而ListView、GridView正好是相反的,它们只是布局方式不一样,但却是两个类型,它们覆写了基类AbsListView的layoutChildren函数来实现不同的布局。显然,通过组合的形式要好于通过继承,因此,RecyclerView在设计上也要好于AbsListView类族。
除此之外,RecyclerView对于Item View的控制也更为精细,可以通过ItemDecotation为Item View添加装饰,也就是在Item View上进行二次加工;又可以用过ItemAnimator为Item View添加动画。
实现横向滚动:
fruit_item.xml 把布局改为垂直方向
MainActivity添加如下代码:
layMan.setOrientation(LinearLayoutManager.HORIZONTAL);
点击事件:
修改FruitAdapter代碼如下:
public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> { private List<Fruit> mFruLis; static class ViewHolder extends RecyclerView.ViewHolder { View fruitView; ImageView fruitImage; TextView fruitName; public ViewHolder(View vie) { super(vie); fruitView = vie; fruitImage = (ImageView) vie.findViewById(R.id.fruit_image); fruitName = (TextView) vie.findViewById(R.id.fruit_name); } } public FruitAdapter(List<Fruit> fruLis) { mFruLis = fruLis; } @Override public ViewHolder onCreateViewHolder(ViewGroup par,int vieTyp) { View vie = LayoutInflater.from(par.getContext()).inflate(R.layout.fruit_item,par,false); final ViewHolder hol = new ViewHolder(vie); hol.fruitView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int pos = hol.getAdapterPosition(); Fruit fru = mFruLis.get(pos); Toast.makeText(v.getContext(),"you clicked view" + fru.getName(),Toast.LENGTH_SHORT).show(); } }); hol.fruitImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int pos = hol.getAdapterPosition(); Fruit fru = mFruLis.get(pos); Toast.makeText(v.getContext(),"you clicked image" + fru.getName(),Toast.LENGTH_SHORT).show(); } }); return hol; } @Override public void onBindViewHolder(ViewHolder hol,int pos) { Fruit fru = mFruLis.get(pos); hol.fruitImage.setImageResource(fru.getImageId()); hol.fruitName.setText(fru.getName()); } @Override public int getItemCount() { return mFruLis.size(); }}
- 关于RecyclerView
- 关于RecyclerView的使用
- 关于RecyclerView的疑惑
- 关于RecyclerView的使用
- 关于RecyclerView的随笔
- 关于Recyclerview使用小记
- 关于RecyclerView刷新
- 关于RecyclerView的一切
- 关于scollview嵌套recyclerview
- 关于RecyclerView的ItemDecoration
- android关于RecyclerView的使用
- 关于RecyclerView的高级使用
- 关于recyclerView分隔线取巧
- RecyclerView关于图片复用
- 关于RecyclerView的一些概念
- 关于RecyclerView的预加载
- 关于RecyclerView的Adapter封装
- 关于RecyclerView的一些笔记
- Objective-C Runtime(四)Method Swizzling
- nginx,apache,MySQL,PHP查看编译参数
- 前端框架模式的变迁
- 学生管理系统(六)---设置窗体
- ios 重复执行方法
- 关于RecyclerView
- 2017.9.19 禁忌 失败总结
- SQL语句中出现中文字符时JDBC报错,解决办法
- html5基本标签和快捷键使用
- XAMPP 安装并使用,简单版
- 沉浸式状态栏全屏使用时的问题
- 《Windows核心编程》读书笔记五 作业
- hibernate @Formula使用问题及分析
- log4cplus崩溃问题