RecyclerView使用详解

使用步骤
  1. 在布局文件中添加RecyclerView控件
  2. 添加一个item布局文件
  3. 创建一个适配器Adapter类,继承自RecyclerView.Adapter.该适配器负责管理数据集合,并将数据绑定到RecyclerView的每个item项中
  4. 创建ViewHolder类,继承自RecyclerView.ViewHolder,viewholder表示RecyclerView中每个item项的视图
  5. 在适配器中实现以下方法
  • 'getItemCount()':返回数据集合的大小
  • 'onCreateViewHolder()':创建viewHolder对象,即创建RecyclerView中每个项的视图
  • 'onBindViewHolder():'将数据绑定到ViewHolder对象中的视图

@Override
public int getItemCount() {
return dataList.size();
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
DataItem item = dataList.get(position);
holder.bindData(item);
}

  1. 在ViewHolder类中,绑定视图的子视图和处理点击事件等操作
  2. 在Activity或Fragment中,初始化RecyclerView和Adapter适配器,并设置布局管理器(LayoutManager)
布局管理器
  • 三种布局管理器都是通过setLayoutManager方法来设置
  1. LinearLayoutManager 线性布局管理器

    LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this);
    layoutManager.setOrientation(RecyclerView.HORIZONTAL);
    mRecyclerView.setLayoutManager(layoutManager);

image.png
  1. StaggeredGridLayoutManager 瀑布流布局管理器

  2. GridLayoutManager 网格布局管理器

    GridLayoutManager layoutManager = new GridLayoutManager(MainActivity.this,3);
    // layoutManager.setOrientation(RecyclerView.HORIZONTAL); 也能设置横向滚动
    mRecyclerView.setLayoutManager(layoutManager);

image.png
itemDirection
  • 通过给item设置itemDirection来装饰item的效果,假设设置间隔线

    DividerItemDecoration mDivider = new
    DividerItemDecoration(this,DividerItemDecoration.VERTICAL);
    mRecyclerView.addItemDecoration(mDivider);

item动画
  • recyclerView提供了默认的itemAnimator的实现类:DefaultItemAnimator,该类可以帮我们实现一些炫酷的动画效果

    Button button = findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    News news = new News();
    news.title = "标题 新内容" ;
    news.content = "内容 新内容" ;
    mNewsList.add(1,news);
    mMyAdapter.notifyItemInserted(1);
    }
    });
    Button button1 = findViewById(R.id.button1);
    button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    mNewsList.remove(0);
    mMyAdapter.notifyItemMoved(0,1);
    }
    });

item点击
  • 我们可以通过对整个item文件的跟布局添加一个点击事件来实现item的点击


    image.png
i上拉刷新加载更多
  • 通常RecyclerView使用的时候需要配合上拉刷新下拉加载更多的动能,可以使用开源控件SmartRefreshLayout来实现SmartRefreshLayout,使用方法如下
  1. 添加依赖
    在gradle文件中添加

    implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.2'
    implementation 'com.scwang.smartrefresh:SmartRefreshHeader:1.1.2'

  2. 布局文件

  • 在activity_main.xml中SmartRefreshLayout控件将RecyclerView包裹起来

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.scwang.smartrefresh.layout.SmartRefreshLayout
    android:id="@+id/refreshLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintTop_toTopOf="parent">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    

    </com.scwang.smartrefresh.layout.SmartRefreshLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>

  1. 逻辑代码
  • 在MainActivity的onCreate方法中添加下拉刷新和加载更多的功能
    下拉刷新:

    RefreshLayout refreshLayout = findViewById(R.id.refreshLayout);
    refreshLayout.setOnRefreshListener(new OnRefreshListener() {
    @Override
    public void onRefresh(RefreshLayout refreshlayout) {
    refreshlayout.finishRefresh(2000/,false/);//传入false表示刷新失败
    mNewsList.clear();
    for (int i = 0; i < 10; i++) {
    News news = new News();
    news.title = "标题 新内容" + i;
    news.content = "内容" + i;
    mNewsList.add(news);
    }
    mMyAdapter.notifyDataSetChanged();
    }
    });

    上拉加载更多

    refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
    @Override
    public void onLoadMore(RefreshLayout refreshlayout) {
    refreshlayout.finishLoadMore(2000/,false/);//传入false表示加载失败
    for (int i = 0; i < 10; i++) {
    News news = new News();
    news.title = "标题 新内容" + i;
    news.content = "内容" + i;
    mNewsList.add(news);
    }
    mMyAdapter.notifyDataSetChanged();
    }
    });


总结
  1. 注意在Acitivity中初始化适配器并且setAdapter
  2. Adapter中重写的方法与作用以及执行的时机:
    1.三个重写方法
    onCreateViewHolder
    该方法用于创建列表项组件 使用该方法所创建的组件会自动被缓存
    onBindViewHolder
    该方法负责为列表项组件绑定数据 每次组件重新显示出来时都会重新执行该方法
    getItemCount
    该方法的返回值决定包含多少个列表项
    1. 执行时机:
      每个item的onCreatViewHolder 和onBindViewHolder方法在存储范围内只会执行一次 如果列表特别长 超出范围后 再回滑需要再次执行
      当开始执行时可以看到 获取了两次item数量 接着获取到item类型 执行onCreatViewHolder 再执行onBindViewHolder方法
      在一个item下滑到完整的第二个item期间 会不断获取item数量和类型
      并且在第一次滑动时会根据情况进行预加载后面的item(有时也会不进行预加载)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,076评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,658评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,732评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,493评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,591评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,598评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,601评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,348评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,797评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,114评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,278评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,953评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,585评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,202评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,180评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,139评论 2 352

推荐阅读更多精彩内容