Android自学——RecyclerView初步

RecyclerView

简介

ListView有自己的缺陷,比如需要进行效率提升,而且只支持竖向滚动。因此出现了增强版的ListView——RecyclerView。

用法

  • 首先需要添加依赖库(版本号跟你的appcompat版本号一致就可以了)
compile 'com.android.support:recyclerview-v7:25.3.0'
  • 布局中添加控件
<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
  • 定义适配器Adapter

和ListView一样需要适配器作为View和ListView之间的桥梁。
之前ListView我们自定义Adapter继承的是ArrayAdapter,而这里RecyclerView我们需要继承的是RecyclerView.Adapter,官方文档有说这是一个Adapter的Base Adapter:

Base class for an Adapter
Adapters provide a binding from an app-specific data set to views that are displayed within a RecyclerView.

因为继承的该Adapter是抽象类,需要实现三个抽象方法onCreateView()onBindViewHolder()getItemCount(),其中第二个方法的第一个参数需要用到RecyclerView.Adapter指定的泛型RecyclerView.ViewHolder,但一般我们会自己自定义一个ViewHolder来存储我们自定义的View的数据,这时候一定要记得自定义的ViewHolder需要继承RecyclerView.ViewHolder,否则onBindViewHolder()方法就会报错:

错误: 类型参数com.example.recyclerview.FruitAdapter.ViewHolder不在类型变量VH的范围内
其中, VH是类型变量:
VH扩展已在类 Adapter中声明的android.support.v7.widget.RecyclerView.ViewHolder

来看看书本中自定义的Adapter的例子:

public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {

    private List<Fruit> mFruitList;  //非公有非静态字段的命名以m开头

    //FruitAdapter的构造函数
    public FruitAdapter(List<Fruit> fruitList) {
        mFruitList = fruitList;
    }

    //自定义ViewHolder内部类,需要继承RecyclerView.ViewHolder
    static class ViewHolder extends RecyclerView.ViewHolder {
        ImageView image;
        TextView name;
        public ViewHodler(View view) {
            super(view);
            image = (ImageView) view.findViewById(R.id.image);
            name = (TextView) view.findViewById(R.id.name);
        }
    }

    //Called when RecyclerView needs a new RecyclerView.ViewHolder of the given type to represent an item. 
    //直译就是在RecyclerView需要为一个新的子项生成一个ViewHolder存储数据的时候就会调用
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.fruit_item, parent, false);
        ViewHolder holder = new ViewHolder(view);
        return holder;
    }

    //Called by RecyclerView to display the data at the specified position. 
    //This method should update the contents of the itemView to reflect the item at the given position.
    //对RecyclerView的子项进行赋值,在子项被滚到屏幕内的时候执行
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Fruit fruit = mFruitList.get(position);
        holder.image.setImageResource(fruit.getImageId());
        holder.name.setText(fruit.getName());
    }

    //返回RecyclerView的子项的个数
    @Override
    public int getItemCount() {
        return mFruitList.size();
    }

}
  • 活动中使用RecyclerView

和ListView相同的地方,都是需要调用setAdapter()方法设置Adapter。不同点在于,RecyclerView还需要设置布局管理器LayoutManager,该管理器用于指定RecyclerView的布局方式(线性布局、水平布局、网格布局等),下面是官方文档的介绍:

RecyclerView.LayoutManager

A LayoutManager is responsible for measuring and positioning item views within a RecyclerView as well as determining the policy for when to recycle item views that are no longer visible to the user. By changing the LayoutManager a RecyclerView can be used to implement a standard vertically scrolling list, a uniform grid, staggered grids, horizontally scrolling collections and more. Several stock layout managers are provided for general use.

RecyclerView.LayoutManager(抽象类)的几个常用的实现类为LinearLayoutManager(线型布局)、StaggeredGridLayoutManager(瀑布流)等。

-LinearLayoutManager的构造函数有一个参数Context。默认竖向布局,改变布局需要调用setOrientation()方法,该方法传入一个参数,可选值为LinearLayoutManager.VERTIACALLinearLayoutManager.HORIZONTAL

-StaggeredGridLayoutManager的构造函数有两个参数,分别为布局的列数
布局的排列方向,布局的排列方向的可选值为StaggeredGridLayoutManager.VERTICALStaggeredGridLayoutManager.HORIZONTAL

举个书本的例子:

public class MainActivity extends AppCompatActivity {

    private List<Fruit> fruitList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle saveInstanceState) {
        super.onCreate(saveInstanceState);
        setContentView(R.layout.activity_main);
        //初始化fruitList的数据,就简单添加几组要展示的数据进去就行了,这里省略具体实现。
        initFruits(); 
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyceler_view);
        //生成布局管理器实例
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        //设置布局管理器的布局排列方向为水平方向
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        recyclerView.setLayoutManager(layoutManager);
        //生成适配器实例
        FruitAdapter adapter = new FruitAdapter(fruitList);
        recyclerView.setAdapter(adapter);
    }

}
  • 点击事件

这个和ListView不一样,ListView提供setItemClickListener()方法来注册每个子项的点击事件,不过,这个点击事件只是相应子项的,并不能响应子项里的具体控件,所以RcyclerView干脆就取消了该方法。要注册点击事件直接注册相应控件的setOnClicckListener()方法即可。由于我们都是把View的数据存在ViewHolder中的,所以自然在onCreateViewHolder()中来创建点击事件。
例如:

static class ViewHolder extends Recycler.ViewHolder {
    //新增用于保存子项最外层布局的实例的View成员,设置该View的点击事件就相当于ListView的setItemClickListener()
    View fruitVeiw;
    ImageView image;
    TextView name;
    public ViewHodler(View view) {
        super(view);
        fruitView = view;
        image = (ImageView) view.findViewById(R.id.image);
        name = (TextView) findViewById(R.id.name);
    }
}

...

public ViewHolder onCreateVeiwHolder(ViewGroup parent, int viewType) {
    ...
    ViewHolder hodler = new ViewHolder(view);
    holder.fruitView.setOnClickListener(点击事件);
    holder.image.setOnClickListener(点击事件);
    ...
}

好了今天就先记到这里吧,因为是刚刚入门,所以就照着书本记一下笔记,RecyclerView还有很多有趣的用法,挖个坑给自己以后慢慢填。纯手打有错误欢迎指正。

主要参考文献:郭霖《第一行代码(第2版)》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值