欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

学习安卓开发[3] - 使用RecyclerView显示列表

程序员文章站 2022-06-05 14:37:55
在上一篇 学习安卓开发[2] 在Activity中托管Fragment 中了解了使用Fragment的好处和方法,本次记录的是在进行列表展示时RecyclerView的使用。 RecyclerView介绍 RecyclerView及其相关类 RecyclerView的应用 引入RecyclerVie ......

在上一篇学习安卓开发[2] - 在activity中托管fragment中了解了使用fragment的好处和方法,本次记录的是在进行列表展示时recyclerview的使用。

  • recyclerview介绍
  • recyclerview及其相关类
  • recyclerview的应用
    • 引入recyclerview
    • 关联recyclerview和fragment
    • viewholder
    • adapter
    • 将adapter和recyclerview关联

recyclerview介绍

很多时候都需要进行列表的展示,比如商品列表,一般的做法是创建一个商品的通用布局,在请求到商品列表数据后,将商品数据转换为商品对象并与一个商品view绑定,这样循环操作就实现了列表的效果。
但如果列表项有很多怎么办呢,如果一次性初始化全部的view很容易搞垮程序。在pc和web程序中可以使用分页的方式,但如果照搬到运行移动app的小屏设备体验会非常差。在小屏设备适合上下滑动的方式,那么能否将上下滑动与分页结合,每次只初始化足够一屏显示的view数量呢,答案是肯定的,recyclerview就是干这个的。

recyclerview的作用的是按需创建view对象,当view被滑动到屏幕外后,recyclerview便会将其回收再利用。

recyclerview及其相关类

要实现这个功能,recyclerview还需要viewholder和adapter的协助,它们之间的关系为:
学习安卓开发[3] - 使用RecyclerView显示列表

图中没有显示adapter的位置,实际上它工作在在recyclerview和viewholer之间,负责为recyclerview提供viewholer对象。adapter是一个控制器对象,从模型层获取数据,然后提供给recyclerview显示,起动桥梁的作用。

recyclerview的应用

引入recyclerview

recyclerview类来自google支持库,所以首先需要添加recyclerview依赖库,这里使用的是recyclerview-v7支持库。然后就可以在列表布局文件中使用它了:

<android.support.v7.widget.recyclerview xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/crime_recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</android.support.v7.widget.recyclerview>

注意要给其指定id。

关联recyclerview和fragment

@override
public view oncreateview(layoutinflater inflater, viewgroup container,
                         bundle savedinstancestate) {
    view view = inflater.inflate(r.layout.fragment_crime_list, container, false);

    mcrimerecyclerview = (recyclerview) view
            .findviewbyid(r.id.crime_recycler_view);
    mcrimerecyclerview.setlayoutmanager(new linearlayoutmanager(getactivity()));

    return view;
}

代码使用了setlayoutmanager(),因为recyclerview无法独立工作,需要layoutmanager的支持,recyclerview在创建完视图后,就立即转交给了layoutmanager,屏幕上列表项的摆放就是layoutmanager负责的,此外它还负责屏幕的滚动行为。

viewholder

viewholder的职责相对简单,既容纳单个列表项view。基本的viewholder使用方式如下,其中list_item_crime为单个列表项view的名称。

private class crimeholder extends recyclerview.viewholder{
    public crimeholder(layoutinflater inflater, viewgroup parent) {
        super(inflater.inflate(r.layout.list_item_crime, parent, false));
    }
}

adapter

在需要显示新创建的viewholder或让view对象与已经创建的viewholder关联时,recyclerview会去问adapter要,recyclerview工作在较高的抽象层,不会关心具体的view对象,这是adapter需要做的事。

private class crimeadapter extends recyclerview.adapter<crimeholder> {

    private list<crime> mcrimes;

    public crimeadapter(list<crime> crimes) {
        mcrimes = crimes;
    }

    @override
    public crimeholder oncreateviewholder(viewgroup parent, int viewtype) {
        layoutinflater layoutinflater = layoutinflater.from(getactivity());
        return new crimeholder(layoutinflater, parent);
    }

    @override
    public void onbindviewholder(crimeholder holder, int position) {
        crime crime = mcrimes.get(position);
        holder.bind(crime);
    }

    @override
    public int getitemcount() {
        return mcrimes.size();
    }
}

将adapter和recyclerview关联

编写好了recyclerview、viewholer和adapter,接下来只需将将adapter和recyclerview关联,就可以正常工作了
编写updateui方法,然后在oncreateview()中,返回view之前调用:

private void updateui() {
    crimelab crimelab = crimelab.get(getactivity());
    list<crime> crimes = crimelab.getcrimes();

    madapter = new crimeadapter(crimes);
    mcrimerecyclerview.setadapter(madapter);
}