Android Studio App开发之循环试图RecyclerView,布局管理器LayoutManager、动态更新循环视图讲解及实战(附源码)

news2025/4/7 4:05:47

运行有问题或需要全部源码请点赞关注收藏后评论区留言~~~

一、循环视图RecyclerView

尽管ListView和GridView分别实现了多行单列和多行多列的列表,使用也很简单,可是它们缺少变化,风格也比较呆板,为此Android推出了更灵活多变的循环视图RecyclerView,它的功能非常强大 下面是它常用方法说明

1:setAdapter 设置列表项的循环适配器

2:setLayoutManager 设置列表项布局管理器

3:addItemDecoration  添加列表项的分割线

4:setItemAnimator 设置列表项的变更动画

5:scrollToPosition 滚动到指定位置

效果如下 仿照微信公众号的消息列表 

 

代码如下

Java类 

package com.example.chapter12;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.example.chapter12.adapter.RecyclerLinearAdapter;
import com.example.chapter12.bean.NewsInfo;
import com.example.chapter12.widget.SpacesDecoration;

public class RecyclerLinearActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycler_linear);
        initRecyclerLinear(); // 初始化线性布局的循环视图
    }

    // 初始化线性布局的循环视图
    private void initRecyclerLinear() {
        // 从布局文件中获取名叫rv_linear的循环视图
        RecyclerView rv_linear = findViewById(R.id.rv_linear);
        // 创建一个垂直方向的线性布局管理器
        LinearLayoutManager manager = new LinearLayoutManager(this, RecyclerView.VERTICAL, false);
        rv_linear.setLayoutManager(manager); // 设置循环视图的布局管理器
        // 构建一个公众号列表的线性适配器
        RecyclerLinearAdapter adapter = new RecyclerLinearAdapter(this, NewsInfo.getDefaultList());
        rv_linear.setAdapter(adapter);  // 设置循环视图的线性适配器
        rv_linear.setItemAnimator(new DefaultItemAnimator());  // 设置循环视图的动画效果
        rv_linear.addItemDecoration(new SpacesDecoration(1));  // 设置循环视图的空白装饰
    }

}

XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="5dp">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_linear"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#aaaaff" />

</LinearLayout>

二、布局管理器LayoutManager

循环视图之所以能够变身为三种列表,是因为它允许指定不同的列表布局,这正是布局管理器LayoutManager的拿手好戏。分别有以下几种管理器 效果如下图

1:线性布局管理器

2:网格布局管理器

 

 

3:瀑布流网格布局管理器

电商App在展示众多商品信息时,往往通过高矮不一的格子展示,因为不同商品的外观尺寸不一样,所以若用一样规格的网格展示,必然有的商品会被压缩的很小,所以根据不同的商品形状展示不同高度的图片,就是瀑布流网格的应用场合

 代码如下

java类

package com.example.chapter12;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.example.chapter12.adapter.RecyclerGridAdapter;
import com.example.chapter12.bean.NewsInfo;
import com.example.chapter12.widget.SpacesDecoration;

public class RecyclerGridActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycler_grid);
        initRecyclerGrid(); // 初始化网格布局的循环视图
    }

    // 初始化网格布局的循环视图
    private void initRecyclerGrid() {
        // 从布局文件中获取名叫rv_grid的循环视图
        RecyclerView rv_grid = findViewById(R.id.rv_grid);
        // 创建一个网格布局管理器(每行5列)
        GridLayoutManager manager = new GridLayoutManager(this, 5);
        rv_grid.setLayoutManager(manager); // 设置循环视图的布局管理器
        // 构建一个市场列表的网格适配器
        RecyclerGridAdapter adapter = new RecyclerGridAdapter(this, NewsInfo.getDefaultGrid());
        adapter.setOnItemClickListener(adapter); // 设置网格列表的点击监听器
        adapter.setOnItemLongClickListener(adapter); // 设置网格列表的长按监听器
        rv_grid.setAdapter(adapter); // 设置循环视图的网格适配器
        rv_grid.setItemAnimator(new DefaultItemAnimator());  // 设置循环视图的动画效果
        rv_grid.addItemDecoration(new SpacesDecoration(1));  // 设置循环视图的空白装饰
    }

}

瀑布流类代码

package com.example.chapter12;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;

import com.example.chapter12.adapter.RecyclerStagAdapter;
import com.example.chapter12.bean.NewsInfo;
import com.example.chapter12.widget.SpacesDecoration;

public class RecyclerStaggeredActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycler_staggered);
        initRecyclerStaggered(); // 初始化瀑布流布局的循环视图
    }

    // 初始化瀑布流布局的循环视图
    private void initRecyclerStaggered() {
        // 从布局文件中获取名叫rv_staggered的循环视图
        RecyclerView rv_staggered = findViewById(R.id.rv_staggered);
        // 创建一个垂直方向的瀑布流布局管理器(每行3列)
        StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(
                3, RecyclerView.VERTICAL);
        rv_staggered.setLayoutManager(manager); // 设置循环视图的布局管理器
        // 构建一个服装列表的瀑布流适配器
        RecyclerStagAdapter adapter = new RecyclerStagAdapter(this, NewsInfo.getDefaultStag());
        adapter.setOnItemClickListener(adapter); // 设置瀑布流列表的点击监听器
        adapter.setOnItemLongClickListener(adapter); // 设置瀑布流列表的长按监听器
        rv_staggered.setAdapter(adapter);  // 设置循环视图的瀑布流适配器
        rv_staggered.setItemAnimator(new DefaultItemAnimator());  // 设置循环视图的动画效果
        rv_staggered.addItemDecoration(new SpacesDecoration(3));  // 设置循环视图的空白装饰
    }

}

XML文件如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_staggered"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#ffffaa" />

</LinearLayout>
-----------------------
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="5dp"
    android:orientation="vertical">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_grid"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

三、动态更新循环视图

循环视图允许动态更新局部记录,既能对一条列表项单独添加修改,也能更新全部列表项,这种动态更新功能用到了循环适配器对象的下列方法

1:notifyItemInserted 通知适配器在指定位置插入了新项

2:notifyItemRemoved 通知适配器在指定位置删除了原有项

3:notifyItemChanged 通知适配器在指定位置发生了数据变化

4:notifyDataSetChanged 通知适配器整个列表的数据发生了变化

动态更新列表项只是在功能上的增强,在更新之时还能展示变更动画,这是循环视图在用户体验上的优化 效果如下

 

 代码如下

Java类

package com.example.chapter12;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.example.chapter12.adapter.LinearDynamicAdapter;
import com.example.chapter12.bean.NewsInfo;
import com.example.chapter12.widget.RecyclerExtras.OnItemClickListener;
import com.example.chapter12.widget.RecyclerExtras.OnItemDeleteClickListener;
import com.example.chapter12.widget.RecyclerExtras.OnItemLongClickListener;
import com.example.chapter12.widget.SpacesDecoration;

import java.util.List;
import java.util.Random;

@SuppressLint("DefaultLocale")
public class RecyclerDynamicActivity extends AppCompatActivity implements View.OnClickListener
        , OnItemClickListener, OnItemLongClickListener, OnItemDeleteClickListener {
    private RecyclerView rv_dynamic; // 声明一个循环视图对象
    private LinearDynamicAdapter mAdapter; // 声明一个线性适配器对象
    private List<NewsInfo> mPublicList = NewsInfo.getDefaultList(); // 当前的公众号信息列表
    private List<NewsInfo> mOriginList = NewsInfo.getDefaultList(); // 原始的公众号信息列表

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycler_dynamic);
        findViewById(R.id.btn_recycler_add).setOnClickListener(this);
        initRecyclerDynamic(); // 初始化动态线性布局的循环视图
    }

    // 初始化动态线性布局的循环视图
    private void initRecyclerDynamic() {
        // 从布局文件中获取名叫rv_dynamic的循环视图
        rv_dynamic = findViewById(R.id.rv_dynamic);
        // 创建一个垂直方向的线性布局管理器
        LinearLayoutManager manager = new LinearLayoutManager(
                this, RecyclerView.VERTICAL, false);
        rv_dynamic.setLayoutManager(manager); // 设置循环视图的布局管理器
        // 构建一个公众号列表的线性适配器
        mAdapter = new LinearDynamicAdapter(this, mPublicList);
        mAdapter.setOnItemClickListener(this); // 设置线性列表的点击监听器
        mAdapter.setOnItemLongClickListener(this); // 设置线性列表的长按监听器
        mAdapter.setOnItemDeleteClickListener(this); // 设置线性列表的删除按钮监听器
        rv_dynamic.setAdapter(mAdapter); // 设置循环视图的线性适配器
        rv_dynamic.setItemAnimator(new DefaultItemAnimator());  // 设置循环视图的动画效果
        rv_dynamic.addItemDecoration(new SpacesDecoration(1));  // 设置循环视图的空白装饰
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.btn_recycler_add) {
            int position = new Random().nextInt(mOriginList.size()-1); // 获取一个随机位置
            NewsInfo old_item = mOriginList.get(position);
            NewsInfo new_item = new NewsInfo(old_item.pic_id, old_item.title, old_item.desc);
            mPublicList.add(0, new_item); // 在顶部添加一条公众号消息
            mAdapter.notifyItemInserted(0); // 通知适配器列表在第一项插入数据
            rv_dynamic.scrollToPosition(0); // 让循环视图滚动到第一项所在的位置
        }
    }

    // 一旦点击循环适配器的列表项,就触发点击监听器的onItemClick方法
    public void onItemClick(View view, int position) {
        String desc = String.format("您点击了第%d项,标题是%s", position + 1,
                mPublicList.get(position).title);
        Toast.makeText(this, desc, Toast.LENGTH_SHORT).show();
    }

    // 一旦长按循环适配器的列表项,就触发长按监听器的onItemLongClick方法
    public void onItemLongClick(View view, int position) {
        NewsInfo item = mPublicList.get(position);
        item.bPressed = !item.bPressed;
        mPublicList.set(position, item);
        mAdapter.notifyItemChanged(position); // 通知适配器列表在第几项发生变更
    }

    // 一旦点击循环适配器列表项的删除按钮,就触发删除监听器的onItemDeleteClick方法
    public void onItemDeleteClick(View view, int position) {
        mPublicList.remove(position);
        mAdapter.notifyItemRemoved(position); // 通知适配器列表在第几项删除数据
    }

}

XML文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn_recycler_add"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="增加新聊天"
        android:textColor="@color/black"
        android:textSize="17sp" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_dynamic"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:background="#aaaaff" />

</LinearLayout>

创作不易 觉得有帮助请点赞关注收藏~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/5475.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CAS:1347750-20-2,NH2-PEG-SH,Amine-PEG-Thiol,氨基-聚乙二醇-巯基供应

1、名称 英文&#xff1a;NH2-PEG-SH&#xff0c;Amine-PEG-Thiol 中文&#xff1a;氨基-聚乙二醇-巯基 2、CAS编号&#xff1a;1347750-20-2 3、所属分类&#xff1a; Amine PEG Thiol PEG 4、分子量&#xff1a;可定制&#xff0c;5000、氨基-聚乙二醇 1000-巯基、1000、…

云计算———虚拟化技术镜像的构建及Harbor的使用(三)

一、容器管理 1.1容器命令 docker ps &#xff1a;查看正在运行的容器 &#xff0c;已经关闭的不能查看 docker ps -a&#xff08;显示所有容器&#xff09; 可以 docker -f rm MyWordPress&#xff1a;-f 强制删除容器 [rootlocalhost ~]# docker ps -a -q #显示所有容器只…

java项目-第127期SpringBoot+vue的智慧养老手表管理系统-java毕业设计_计算机毕业设计

java项目-第127期SpringBootvue的智慧养老手表管理系统-java毕业设计_计算机毕业设计 【源码请到资源专栏下载】 本系统主要是通过智能手表监控老人的日常生活&#xff0c;比如血压、心率、睡眠步数、以及摔倒情况。 共分为两个角色&#xff1a;家长&#xff0c;养老院管理员&a…

有含金量的AI证书

文章目录证书展示企业认证介绍华为认证人工智能工程师课程内容我的总结和资料证书展示 这是华为云的AI认证&#xff1a; 这是阿里云的大数据认证&#xff1a; 企业认证介绍 一般的企业是办不起来认证的&#xff0c;大家肯定都知道的。本文主要介绍华为云的认证&#xff0c…

经典动态规划:最长递增子序列

力扣第300题&#xff1a;[最长递增子序列]&#xff0c;这道题是非常经典的动态规划和二分查找的题目&#xff0c;我们先看dp: 第一种解法&#xff1a;动态规划 我们先看题目的示例1&#xff1a; 输入&#xff1a;nums [10,9,2,5,3,7,101,18] 输出&#xff1a;4 解释&#x…

【MySQL】MySQL数据库锁使用与InnoDB加锁的原理解析(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

【Spring】Bean 的作用域和生命周期

文章目录1. Bean 的作用域1.1 通过一个案例来看 Bean 作用域的问题1.2 作用域的定义1.3 Spring Bean 支持的作用域&#xff08;未介绍完全&#xff09;1.4 修改 Bean 的作用域1.5 Bean 执行流程2. Bean 的生命周期2.1 Bean 的生命周期分为以下 5 大部分2.1.1 实例化 Bean&#…

【代码精读】在optee中注册一个中断

快速链接: . 👉👉👉 【代码精读】–Kernel/ATF/optee等-目录👈👈👈 付费专栏-付费课程 【购买须知】:本专栏的视频介绍-----视频👈👈👈概要: 在optee os总如何注册一个中断? 有没有类似于request_irq的程序? 注册了该中断后,是哪里将该中断配置成Secure…

保边滤波之基于测地距离的滤波与局部拉普拉斯滤波

&#xff08;1&#xff09;基于测地距离的滤波 给定图像I及其Hard Mask M&#xff0c;其中M(x)∈{0,1} &#xff0c;M(x)0表示x属于前景&#xff0c;M(x)1表示x属于背景&#xff0c;图像中某点x到前面Hard Mask的测地距离为 &#xff1f;&#xff1f;&#xff1f;d(a,b)表示…

机器学习中的数学原理——最小二乘法

这几天在刷B站的时候&#xff0c;有个深度学习的博主推荐了一本机器学习的书——《白话机器学习的数学》&#xff0c;抱着浅看一下的态度&#xff0c;我花3个大洋从淘宝上找到了这本书的电子版。看了两天我直接吹爆&#xff01;&#xff01;&#xff01;所以这个专栏就分享一下…

《Linux驱动:DMA直接内存访问》

目录一、前言二、DMA传输主体三、S3c2440上的DMA3.1 DMA请求源3.2 DMA状态机3.3 DMA请求模式3.4 DMA服务模式3.5 DMA传输模式3.6 DMA读写数据大小3.7 DMA寄存器3.7.1 DCON寄存器其他几个重要位四、使用DMA4.1 软件触发DMA4.2 硬件源触发DMA一、前言 DMA(Direct Memory Aaccess…

SpringMVC框架中的拦截器

目录 1. 拦截器接口的介绍 2. 拦截器接口中方法的详细介绍 3. 配置拦截器的步骤 4. 多个拦截器的的执行情况 5. 拦截器与过滤器的区别 1. 拦截器接口的介绍 2. 拦截器接口中方法的详细介绍 public class MyInterceptor implements HandlerInterceptor {Overridepublic bo…

Elasticsearch学习--script

一、概念 es1.4-5.0&#xff0c;默认脚本语言是Grovvy es5.0&#xff0c;默认脚本语言是painless 二、简单使用 将price减一 # 将id1的price减一 POST goods/_update/1 {"script": {"source": "ctx._source.price - 1"} }# 简写 POST goods/_…

Cloud Computing之时钟和顺序Time and Ordering

文章目录Total orderImplementation of total orderLinearizabilityFIFO rderImplementation of FIFO-orderHappen-before orderingCausal orderingSummary参考文献&#xff1a;Lamport’s logical clock 这章重点介绍了分布式系统下各种类型的时序&#xff0c;其实在分布式场景…

【Linux】网络配置详解

网络配置一.网络连接测试1.查看宿主机和虚拟机ip(1)查看宿主机ip①宿主机:可视化界面查看ip②宿主机:命令行查看ip(2)查看虚拟机ip①虚拟机:可视化界面查看ip②虚拟机:命令行查看ip2.测试宿主机和虚拟机的网络通信(1).宿主机ping虚拟机(2).虚拟机ping宿主机二.网络连接模式1.桥…

420招募线上被试 | 高素质人才行为心理测试

招募中 【实验任务】高素质人才行为心理测试 【实验时长】18分钟 【实验时间】2022年11月12日00时 - 2022年11月20日24时 【实验地点】线上实验 【实验报酬】微信红包&#xff0c;每份问卷3元 【实验要求】如实回答问卷问题&#xff0c;并提供微博账号和微博地址 【被试要…

Js逆向教程-03浏览器调试工具-Source面板

Js逆向教程-03浏览器调试工具-Source面板 切换到source面板&#xff0c;对于source面板&#xff0c;需要打开搜索面板才能发挥出完整的功能。 一、搜索面板 通过点击右上角的按钮&#xff0c;切换到搜索面板 搜索页面的左侧&#xff0c;可以给搜索页面添加其他功能 比如cons…

第1章 数据结构的概念

文章目录文档配套视频讲解链接地址第01章 数据结构的概念1.1 数据结构的知识体系1.2 链表1. 创建头结点的内存图2. 插入1节点时的内存图3. 插入2节点时的内存图4. 插入3节点的内存图5. 实例1 链表节点的插入6. 链表删除节点37. 实例2 链表的删除节点8. 实例3 链表的改查逆序9. …

Allegro阻抗分析指导书

Allegro阻抗分析指导书 利用Allegro自带的功能可以快速分析信号的阻抗 操作如下 首先用172版本打开PCB 把每层厚度和介电常数填写进去 点击work flow Manager,出现右图对话框 选择需要查看的网络 点击start Analysis 点击impedance table和impedance vision就可以查看阻…

【网络篇】第九篇——多线程版的TCP网络程序

多进程与多线程对比 多进程 多线程 多线程版的TCP网络程序 多进程与多线程对比 多进程 优点 可以处理多个用户易于边写稳定&#xff0c;因为进程具有独立性 缺点 连接来了之后才创建进程&#xff0c;性能太低多进程服务器特别吃资源&#xff0c;而且同时服务的客户有上限…