RecycleView

简介

  • 从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传统的ListView,更加强大和灵活。
  • RecyclerView是一个强大的滑动组件,与经典的ListView相比,同样拥有item回收复用的功能,这一点从它的名字Recyclerview即回收view也可以看出。
  • RecyclerView 支持 线性布局网格布局瀑布流布局 三种,而且同时还能够控制横向还是纵向滚动。

布局块

步骤

  1. 在主布局中引入控件

  2. 编写好子项布局

布局第一步:主要是在主布局中引入RecyclerView控件。

注意:因为是远程导入的,所以需要把完整的包名写出来 activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"android:padding="15dp"android:layout_height="match_parent"tools:context=".MainActivity1"><androidx.recyclerview.widget.RecyclerViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/rv_view"/>
</LinearLayout>

布局第二步:创建子布局,然后在子布局中,写好自己的子项布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:padding="15dp"android:background="@color/teal_200"android:layout_height="wrap_content"><ImageViewandroid:layout_width="50dp"android:layout_height="50dp"android:id="@+id/iv_icon1"/><TextViewandroid:textSize="15sp"android:layout_marginLeft="20dp"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:id="@+id/tv_name1"/>
</LinearLayout>

代码块

代码第一步:编写实体类

package com.hoop.myapplication.model;public class AddressBook {private String name;private int imagid;public AddressBook(String name, int imagid) {this.name = name;this.imagid = imagid;}public String getName(){return name;}public int getImagid(){return imagid;}
}

代码第二步:创建适配器

  1. 创建一个新类:AddressBookAdapter继承RecyclerView.Adapter,并且将泛型指定为AddressBookAdapter.ViewHolder。 一开始这么写会报错,因为ViewHolder是一个内部类,我们还没有定义。所以接下来我们就定义内部类。这个内部类的作用主要是通过传入的一个参数view,从而获取RecyclerView子项的最外层布局,然后通过findViewById()方法获取控件的实例(在本例子中获取的是ImageView和TextView)。

  2. 定义全局变量mList,生成构造函数。 这个构造函数是用来把要展示的数据源(图片、名字)传进来,并赋值给mList。

  3. 重写onCreateViewHolder()方法 这个函数主要是用来加载子项布局(addressbook_item),然后创建ViewHolder实例并把子项布局传入到构造函数中,最后返回ViewHolder实例。

  4. 重写onBindViewHolder()方法 这个方法是用来对传入的子项布局进行赋值的,也就是说当子项布局被传入进来,是它让布局有了名字、图片。它会在每个布局被滚动到屏幕的时候执行。在本例子中,是通过position参数得到当前项的AddressBook实例,然后再把数据设置到ViewHolder的ImageView和TextView里。

  5. 重写getItemCount()方法 这个方法主要是用来返回数据源的长度,也就是告诉RecyclerView他有多少个子项

package com.hoop.myapplication.adapter;import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;import com.hoop.myapplication.R;
import com.hoop.myapplication.model.AddressBook;import java.util.List;public class AddressBookAdapter extends RecyclerView.Adapter<AddressBookAdapter.ViewHolder> {private List<AddressBook> mlist;@NonNull@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.addressbook_item1,parent,false);ViewHolder viewHolder = new ViewHolder(view);return viewHolder;}@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {AddressBook addressBook =mlist.get(position);holder.image.setImageResource(addressBook.getImagid());holder.name.setText(addressBook.getName());}@Overridepublic int getItemCount() {return mlist.size();}public class ViewHolder extends RecyclerView.ViewHolder {ImageView image;TextView name;public ViewHolder(@NonNull View itemView) {super(itemView);image = itemView.findViewById(R.id.iv_icon1);name = itemView.findViewById(R.id.tv_name1);}}public AddressBookAdapter(List<AddressBook> mlist){this.mlist =mlist;}
}

代码第三步:在主活动中使用

  1. 获取RecyclerView的实例

  2. 创建LinearLayoutManager对象

  3. 创建AddressBookAdapter实例

  4. 模拟数据

  5. 将模拟数据传入AddressBookAdapter的构造函数中

  6. 调用setAdapter()方法完成适配器设置

package com.hoop.myapplication;import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import android.os.Bundle;import com.hoop.myapplication.adapter.AddressBookAdapter;
import com.hoop.myapplication.model.AddressBook;import java.util.ArrayList;
import java.util.List;public class MainActivity1 extends AppCompatActivity {private String[] names ={"草莓","菠萝","橘子","葡萄","樱桃","青提","杏子","火龙果","柠檬"};private int[] imgs={R.mipmap.caomei,R.mipmap.fengli,R.mipmap.juzi,R.mipmap.putao,R.mipmap.yingtao,R.mipmap.qingti,R.mipmap.xingzi,R.mipmap.huolongguo,R.mipmap.ningmeng};private List<AddressBook> list = new ArrayList<>();private RecyclerView rv_view;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main1);//设置数据源initData();rv_view = findViewById(R.id.rv_view);AddressBookAdapter addressBookAdapter = new AddressBookAdapter(list);//设置布局管理器 设置纵向布局LinearLayoutManager layoutManager = new LinearLayoutManager(this);rv_view.setLayoutManager(layoutManager);rv_view.setAdapter(addressBookAdapter);}private void initData(){for (int i = 0; i < names.length; i++) {AddressBook addressBook = new AddressBook(names[i], imgs[i]);list.add(addressBook);}}
}

其他布局的设置

//设置横向布局
        //设置数据源initData();rv_view = findViewById(R.id.rv_view);AddressBookAdapter addressBookAdapter = new AddressBookAdapter(list);//设置布局管理器LinearLayoutManager layoutManager = new LinearLayoutManager(this);//设置横向layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);rv_view.setLayoutManager(layoutManager);rv_view.setAdapter(addressBookAdapter);
设置网格
       //设置数据源initData();rv_view = findViewById(R.id.rv_view);AddressBookAdapter addressBookAdapter = new AddressBookAdapter(list);//设置布局管理器//设置网格GridLayoutManager layoutManager =new GridLayoutManager(this,3);rv_view.setLayoutManager(layoutManager);rv_view.setAdapter(addressBookAdapter);

Viewpager2

概述

ViewPager2 是基于 RecyclerView 实现的,自然继承了 RecyclerView 的众多优点,并且针对ViewPager 存在的问题做了优化。

  • 支持垂直方向的滑动且实现极其简单。
  • 完全支持 RecyclerView 的相关配置功能。
  • 支持多个 PageTransformer。
  • 支持 DiffUtil,局部数据刷新和 Item 动画。
  • 支持模拟用户滑动与禁止用户操作

Viewpager2 的步骤和RecycleView是一样的

下面是Viewpager2 的案例

xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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=".MainActivity4"><androidx.viewpager2.widget.ViewPager2android:layout_width="match_parent"android:layout_height="250dp"android:id="@+id/vp_imgsn"/></LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/rl_cos"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/tv_yst"android:layout_width="match_parent"android:layout_height="wrap_content"/></RelativeLayout>

实体类

package com.hoop.myapplication.model;public class ViewPagers2 {private String names;private int colours;public String getNames() {return names;}public int getColours() {return colours;}public ViewPagers2(String names, int colours) {this.names = names;this.colours = colours;}
}

适配器

package com.hoop.myapplication.adapter;import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;import com.hoop.myapplication.R;
import com.hoop.myapplication.model.ViewPagers2;import java.util.List;public class ViewPager2Adapter extends RecyclerView.Adapter<ViewPager2Adapter.ViewHolder>{private final List<ViewPagers2> list;public ViewPager2Adapter(List<ViewPagers2> list) {this.list = list;}public class ViewHolder extends RecyclerView.ViewHolder {TextView tv_yst;RelativeLayout rl_cos;public ViewHolder(@NonNull View itemView) {super(itemView);tv_yst = itemView.findViewById(R.id.tv_yst);rl_cos = itemView.findViewById(R.id.rl_cos);}}@NonNull@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.viewpager2,parent,false);ViewHolder viewHolder = new ViewHolder(view);return viewHolder;}@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {ViewPagers2 viewPager2 = list.get(position);holder.tv_yst.setText(viewPager2.getNames());holder.rl_cos.setBackgroundColor(viewPager2.getColours());}@Overridepublic int getItemCount() {return list.size();}
}

java文件

package com.hoop.myapplication;import android.graphics.Color;
import android.os.Bundle;import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager2.widget.MarginPageTransformer;
import androidx.viewpager2.widget.ViewPager2;import com.hoop.myapplication.adapter.ViewPager2Adapter;
import com.hoop.myapplication.model.ViewPagers2;import java.util.ArrayList;
import java.util.List;public class MainActivity4 extends AppCompatActivity {private List<ViewPagers2> list=new ArrayList<>();private ViewPager2 vp_imgsn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main4);intn();vp_imgsn=findViewById(R.id.vp_imgsn);ViewPager2Adapter viewPager2Adapter =new ViewPager2Adapter(list);MarginPageTransformer pageTransformer =new MarginPageTransformer(20);vp_imgsn.setAdapter(viewPager2Adapter);}private void intn() {ViewPagers2 pager1=new ViewPagers2("蓝色", Color.BLUE);list.add(pager1);ViewPagers2 pager2=new ViewPagers2("黄色", Color.YELLOW);list.add(pager2);ViewPagers2 pager3=new ViewPagers2("红色", Color.RED);list.add(pager3);ViewPagers2 pager4=new ViewPagers2("绿色", Color.GREEN);list.add(pager4);}
}

RecycleView 和Viewpager2相关推荐

  1. Android开发的各个领域发展前景?路线?规划未来看这篇

    现在绝大部分人都感觉Android开发不好做,其实不止Android这块,整个IT行业都在变.而我们要做的是如何提高自身技术:转战其他细分区域才是对未来做打算. 从2016开始许多人就说Android ...

  2. NestedScrollView、RecycleView、ViewPager 嵌套常见问题

    在开发中我们经常会用到 NestedScrollView 和 RecycleView,一般情况下这两种布局是不需要进行嵌套的,很多情况下 RecycleView 就可以自行解决,但是毕竟是一般情况,因 ...

  3. 【Android】RecycleView简单仿漫画APP图片相关样式

    真的真的想不到起什么标题好了,这次的内容真的是太简单了,没有什么挑战性,一天以内就完成了.最近在学kotlin,也会有一份kotlin的代码,鉴于很多人都是从java开始进行android开发的,ko ...

  4. RecyclerView与ViewPager2

    RecyclerView与ViewPager2 文章目录 RecyclerView与ViewPager2 1:RecyclerView 1.1:基本使用方法 1.1.1定制 RecyclerView ...

  5. ViewPager2和Fragment的组合使用

    2019年11月20号,期待已久的ViewPager2 正式版终于发布了! 一.ViewPager2的新特性 ViewPager2从名字就可以看出来它是ViewPager的升级版,既然是升级版那么它相 ...

  6. RecycleView的Item曝光事件、曝光时间、阅读进度上报

    2020-10-22 更新 在日常使用过程中,发现在onScroll中进行上报会大大增加滑动时的性能消耗(由于在onScroll在滑动时过于频繁,而每次findFirstVisibleItemPosi ...

  7. 解决ViewPager2刷新Item闪动的问题

    去掉ViewPager2刷新动画 今天在开发项目的时候用到了ViewPager2,一开始都挺顺利的,ViewPager2内部是RecycView实现的所以写起来跟RecycleView一样简单,但是也 ...

  8. ViewPager2+Fragment操作笔记

    ViewPager2+Fragment操作笔记 文章目录 ViewPager2+Fragment操作笔记 ViewPager2简介 实际操作效果 RecycleView和Viewpage2的滑动冲突 ...

  9. android viewpager2,viewpager2原理和使用

    近期google官网上更新了viewpager2, 支持垂直滚动, 重写之前的viewpager. 1.原理: viewpager2 内部实现原理是使用recycleview加LinearLayout ...

最新文章

  1. PHP的简单跳转提示的实现
  2. 【杂谈】参加有三AI秋季划4个月,薪资翻倍,我在有三AI都学了啥?
  3. Matlab数组创建
  4. MySQL 性能调优之存储引擎
  5. flash背景透明、置底、禁止放大 右键菜单
  6. CVE-2009-3459
  7. 任务管理器启动资源管理器
  8. java语言精通能干什么_Java学到什么程度才能叫精通?
  9. 字符串,字节,二进制转换
  10. 5岁儿童自学python编程-小孩子如何学python?
  11. airplay服务器linux,在Linux实现airplay
  12. python自动化面试提问_Python自动化测试笔试面试题精选
  13. express + uniapp发送图片和保存图片
  14. java_home的变量是_JAVA坏境变量中的JAVA_HOME path classpath 的设置与作用
  15. APQ:联合搜索网络架构、剪枝和量化
  16. 2022-7 一套鼠标键盘控制两台及以上电脑
  17. python计算相关性系数
  18. python 拷贝文件创建目录失败_解决python os.mkdir创建目录失败的问题
  19. linux 搭建webserver-Goahead
  20. 1200000有多少个约数

热门文章

  1. 【智能物流】河南烟草:新网络模式下的物流系统优化
  2. MIT 6.828 学习笔记4 Lab2实验报告
  3. Python中字符串和二进制互转
  4. (筆記) 使役動詞 (English)
  5. html整体垂直居中,让html img图片垂直居中的三种方法
  6. 应用 Rational 工具简化基于 J2EE 的项目第 8 部分 :测试软件
  7. Android开发之播放音频
  8. 从Java/Android到Swift iOS开发:语言与框架对比
  9. 外部数据导入qiime2软件内部
  10. Web3时代加密元宇宙才是唯一可行的道路