当前位置: 移动技术网 > IT编程>移动开发>Android > 学习安卓开发[3] - 使用RecyclerView显示列表

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

2018年11月26日  | 移动技术网IT编程  | 我要评论

狠狠爱影院,蟑螂养殖,mp3dj舞曲

在上一篇学习安卓开发[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的协助,它们之间的关系为:

图中没有显示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);
}

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网