电子商务网站建设与维护ppt/百度识图在线识别

电子商务网站建设与维护ppt,百度识图在线识别,东明网站制作,本地建设网站引言 在 Android 开发中,RecyclerView是高效展示列表数据的核心组件。其强大的性能源于独特的视图复用机制和四级缓存体系。本文将结合源码与示例,带你深入理解RecyclerView的工作原理与优化策略。 核心组件 RecyclerView:作为容器视图&am…

引言

在 Android 开发中,RecyclerView是高效展示列表数据的核心组件。其强大的性能源于独特的视图复用机制和四级缓存体系。本文将结合源码与示例,带你深入理解RecyclerView的工作原理与优化策略。

核心组件

  • RecyclerView:作为容器视图,负责管理和展示列表数据。它会根据布局管理器对列表项进行布局。
  • LayoutManager:用于确定列表项的布局方式,如线性布局、网格布局、瀑布流布局等。
  • Adapter:充当数据和视图之间的桥梁,负责将数据绑定到视图上。它会创建列表项的视图并填充数据。
  • ViewHolder:用来缓存列表项视图中的子视图,避免每次都通过 findViewById 查找视图,从而提升性能。

工作流程

1. 初始化 RecyclerView

在布局文件里添加 RecyclerView 组件,然后在代码中对其进行初始化。

<androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"/>
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;public class MainActivity extends AppCompatActivity {private RecyclerView recyclerView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);recyclerView = findViewById(R.id.recyclerView);// 设置布局管理器recyclerView.setLayoutManager(new LinearLayoutManager(this));}
}
2. 创建 Adapter 和 ViewHolder

Adapter 要继承 RecyclerView.Adapter,并实现必要的方法。ViewHolder 则要继承 RecyclerView.ViewHolder

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {private List<String> dataList;public MyAdapter(List<String> dataList) {this.dataList = dataList;}@NonNull@Overridepublic MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {// 创建视图View view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);return new MyViewHolder(view);}@Overridepublic void onBindViewHolder(@NonNull MyViewHolder holder, int position) {// 绑定数据String data = dataList.get(position);holder.textView.setText(data);}@Overridepublic int getItemCount() {return dataList.size();}public static class MyViewHolder extends RecyclerView.ViewHolder {TextView textView;public MyViewHolder(@NonNull View itemView) {super(itemView);textView = itemView.findViewById(android.R.id.text1);}}
}
3. 设置 Adapter

在 Activity 或者 Fragment 中为 RecyclerView 设置 Adapter

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {private RecyclerView recyclerView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);recyclerView = findViewById(R.id.recyclerView);recyclerView.setLayoutManager(new LinearLayoutManager(this));// 模拟数据List<String> dataList = new ArrayList<>();for (int i = 0; i < 100; i++) {dataList.add("Item " + i);}// 设置 AdapterMyAdapter adapter = new MyAdapter(dataList);recyclerView.setAdapter(adapter);}
}

视图复用机制

RecyclerView 最核心的优化点在于视图复用机制。当列表项滑出屏幕时,RecyclerView 不会将其销毁,而是把它放入回收池中。当新的列表项需要显示时,RecyclerView 会优先从回收池中获取可用的视图,然后通过 Adapter 的 onBindViewHolder 方法为其绑定新的数据,这样就避免了频繁创建和销毁视图,大大提升了性能。

RecyclerView 的缓存机制是其高效展示大量数据的关键所在,它能够显著减少视图创建和销毁的开销,从而提升性能和响应速度。下面为你详细介绍 RecyclerView 的缓存机制。

缓存层级

RecyclerView 的缓存机制包含四级缓存,分别是:

  1. Scrap 缓存(mAttachedScrap 和 mChangedScrap)
    • 功能:这是 RecyclerView 的一级缓存,用于临时存储正在被重新布局的 ViewHolder。当 RecyclerView 进行布局操作时,比如滚动、插入或删除项目,这些 ViewHolder 会被暂时从屏幕上移除并放入 Scrap 缓存中,布局完成后再从这里取出重新使用。
    • 特点:速度最快,因为这些 ViewHolder 无需重新绑定数据,可直接复用。
  2. Cache 缓存(mCachedViews)
    • 功能:二级缓存,用于存储最近被移除屏幕的 ViewHolder。当用户快速滚动列表时,这些 ViewHolder 可以被快速复用,而不需要重新创建和绑定数据。
    • 特点:默认大小为 2,可以通过 setItemViewCacheSize 方法进行调整。缓存中的 ViewHolder 保持着原有的数据和状态,复用速度较快。
  3. ViewCacheExtension 缓存
    • 功能:三级缓存,这是一个由开发者自定义的缓存接口。开发者可以根据自身需求实现这个接口,以创建自定义的缓存逻辑。
    • 特点:灵活性高,但需要开发者自己管理缓存的添加、移除和查找操作。
  4. RecycledViewPool 缓存
    • 功能:四级缓存,用于存储不同类型的 ViewHolder。当 Cache 缓存已满时,新移除的 ViewHolder 会被放入 RecycledViewPool 中。当需要新的 ViewHolder 时,如果 Scrap 缓存和 Cache 缓存中没有可用的,就会从 RecycledViewPool 中查找。
    • 特点:这里的 ViewHolder 会被重置,需要重新绑定数据。不同类型的 ViewHolder 可以有不同的缓存大小,默认每个类型的缓存大小为 5。

缓存工作流程

1. 获取 ViewHolder

当 RecyclerView 需要一个新的 ViewHolder 来显示列表项时,会按照以下顺序从缓存中查找:

  • 首先检查 Scrap 缓存,如果找到匹配的 ViewHolder,直接使用,无需重新绑定数据。
  • 若 Scrap 缓存中没有,接着检查 Cache 缓存。如果找到,同样可以直接使用,并且保留原有的数据和状态。
  • 若 Cache 缓存也没有,再检查自定义的 ViewCacheExtension 缓存。
  • 若以上缓存都没有找到,最后检查 RecycledViewPool 缓存。如果找到,需要重新绑定数据。
  • 如果所有缓存中都没有找到合适的 ViewHolder,则调用 Adapter 的 onCreateViewHolder 方法创建一个新的 ViewHolder,并绑定数据。
2. 回收 ViewHolder

当列表项滑出屏幕时,ViewHolder 会按照以下规则被回收:

  • 首先尝试将 ViewHolder 放入 Cache 缓存中。如果 Cache 缓存已满,则将最旧的 ViewHolder 移除,放入 RecycledViewPool 中,然后将新的 ViewHolder 放入 Cache 缓存。
  • 如果 Cache 缓存没有满,直接将 ViewHolder 放入 Cache 缓存。

示例代码

以下是一个简单的示例,展示了如何使用 RecycledViewPool

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.os.Bundle;
import java.util.ArrayList;
import java.util.List;public class MainActivity extends AppCompatActivity {private RecyclerView recyclerView1, recyclerView2;private RecyclerView.RecycledViewPool viewPool;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 初始化 RecycledViewPoolviewPool = new RecyclerView.RecycledViewPool();// 第一个 RecyclerViewrecyclerView1 = findViewById(R.id.recyclerView1);recyclerView1.setLayoutManager(new LinearLayoutManager(this));recyclerView1.setRecycledViewPool(viewPool);List<String> dataList1 = new ArrayList<>();for (int i = 0; i < 100; i++) {dataList1.add("Item 1 - " + i);}MyAdapter adapter1 = new MyAdapter(dataList1);recyclerView1.setAdapter(adapter1);// 第二个 RecyclerViewrecyclerView2 = findViewById(R.id.recyclerView2);recyclerView2.setLayoutManager(new LinearLayoutManager(this));recyclerView2.setRecycledViewPool(viewPool);List<String> dataList2 = new ArrayList<>();for (int i = 0; i < 100; i++) {dataList2.add("Item 2 - " + i);}MyAdapter adapter2 = new MyAdapter(dataList2);recyclerView2.setAdapter(adapter2);}
}

在这个示例中,两个 RecyclerView 共享同一个 RecycledViewPool,这样可以提高视图的复用率,减少内存开销。

缓存层级对比

缓存层级存储内容特点典型场景
Scrap 缓存当前屏幕可见 ViewHolder无需重新绑定数据布局更新时复用
Cache 缓存最近移出屏幕的 ViewHolder保留数据状态快速滚动时复用
ViewCacheExtension自定义缓存逻辑开发者可控特殊业务场景
RecycledViewPool未绑定数据的 ViewHolder跨列表共享缓存多个列表复用同一 ViewPool

2. 缓存工作流程

  1. 获取 ViewHolder:按层级依次查找 Scrap → Cache → ViewCacheExtension → RecycledViewPool → 新建
  2. 回收 ViewHolder:移出屏幕时优先存入 Cache,满容后转移至 RecycledViewPool

3. 缓存优化实践

// 配置缓存大小
recyclerView.setItemViewCacheSize(5); // 增大Cache缓存容量
recyclerView.getRecycledViewPool().setMaxRecycledViews(ViewType, 10); // 调整RecycledViewPool容量// 跨列表共享缓存
RecyclerView recyclerView1 = findViewById(R.id.rv1);
RecyclerView recyclerView2 = findViewById(R.id.rv2);
recyclerView2.setRecycledViewPool(recyclerView1.getRecycledViewPool());

性能优化建议

  1. 合理使用 ViewHolder:避免在onBindViewHolder中执行耗时操作
  2. 数据变化优化:使用DiffUtil实现局部刷新
DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(new MyCallback(oldList, newList));
diffResult.dispatchUpdatesTo(adapter);
  1. 布局优化:减少布局层级,使用merge标签
  2. 预加载策略:通过addOnScrollListener实现分页加载

总结

RecyclerView通过视图复用四级缓存实现了高效的列表渲染,其设计思想对理解现代 UI 框架具有重要参考价值。在实际开发中,需根据业务场景合理配置缓存参数,结合DiffUtil等工具实现性能与体验的平衡。

感谢观看!!!

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

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

相关文章

【鸿蒙开发】Hi3861学习笔记- TCP客户端

00. 目录 文章目录 00. 目录01. TCP概述02. TCP应用场景03. TCP和UDP比较04. TCP相关API05. TCP编程流程06. 硬件设计07. 软件设计08. 实验现象09. 附录 01. TCP概述 TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接、可靠的传输层协议&#xff0c;旨…

2025-03-25 学习记录--C/C++-PTA 习题9-3 平面向量加法

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 习题9-3 平面向量加法 本题要求编写程序&#xff0c;计算两个二维平面向量的和向量。 输入格式: ❀ 输入在…

23种设计模式-桥接(Bridge)设计模式

桥接设计模式 &#x1f6a9;什么是桥接设计模式&#xff1f;&#x1f6a9;桥接设计模式的特点&#x1f6a9;桥接设计模式的结构&#x1f6a9;桥接设计模式的优缺点&#x1f6a9;桥接设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是桥接设计模式…

go:前后端分离

1.前端代码 新建一个前端文件夹&#xff0c;在该文件夹下新建一个.html文件&#xff0c;写入自己的html代码。 前端搞定。 2.后端代码 其核心是挂载路由接受前端传来的数据核心代码如下&#xff1a; func main() { // 服务运行提示 fmt.Println("go web server is runn…

JetsonNano —— 4、Windows下对JetsonNano板卡烧录刷机Ubuntu20.04版本(官方教程)

介绍 NVIDIA Jetson Nano™ 开发者套件是一款面向创客、学习者和开发人员的小型 AI 计算机。按照这个简短的指南&#xff0c;你就可以开始构建实用的 AI 应用程序、酷炫的 AI 机器人等了。 烧录刷机 1、下载 Jetson Nano开发者套件SD卡映像 解压出.img文件并记下它在计算机上的…

文件I/O--C++的文件操作

一、打开文件&#xff0c;从文件中读取、写入文件 从文件中读取数据&#xff1a; #include<fstream> //fstream File stream:文件流 #include<iostream> //fstream包含了 iostream&#xff0c;所以这句可以省略&#xff0c;现在不能了 using namespace std;i…

C语言贪吃蛇实现

When the night gets dark,remember that the Sun is also a star. 当夜幕降临时&#xff0c;请记住太阳也是一颗星星。 ————《去月球海滩篇》 目录 文章目录 一、《贪吃蛇》游戏介绍 二、WIN32部分接口简单介绍 2.1 控制台窗口大小设置 2.2 命令行窗口的名称的变更 2…

基于vue.js开发的家庭装修管理系统开发与设计(源码+lw+部署文档+讲解),源码可白嫖!

摘要 本家庭装修管理系统采用B/S架构&#xff0c;数据库是MySQL&#xff0c;网站的搭建与开发采用了先进的Node.js语言进行编写&#xff0c;使用了VUE框架。该系统从两个对象&#xff1a;由管理员和用户来对系统进行设计构建。用户的功能包括&#xff1a;注册、登录、浏览首页…

OpenCV图像拼接(5)图像拼接模块的用于创建权重图函数createWeightMap()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::detail::createWeightMap 是 OpenCV 库中用于图像拼接模块的一个函数&#xff0c;主要用于创建权重图。这个权重图在图像拼接过程中扮演着重…

LangGraph 怎么控制递归次数

这一节我们讲讲langgraph图的递归限制 Recursion Limit&#xff0c;递归限制设置了图在单次执行过程中可以执行的最大超级步骤数。一旦达到该限制&#xff0c;LangGraph 将引发 GraphRecursionError 错误。默认情况下&#xff0c;此值设置为 25 步。递归限制可以在运行时为任何…

Milvus WeightedRanker 对比 RRF 重排机制

省流:优先选择WeightedRanker 以rag为例,优先选择bm25全文检索,其次选择向量检索 Milvus混合搜索中的重排机制 Milvus通过hybrid_search() API启用混合搜索功能&#xff0c;结合复杂的重排策略来优化多个AnnSearchRequest实例的搜索结果。本主题涵盖了重排过程&#xff0c;…

在K8S中使用ArgoCD做持续部署

一、了解argocd ArgoCD是一个基于Kubernetes的GitOps持续交付工具&#xff0c;应用的部署和更新都可以在Git仓库上同步实现&#xff0c;并自带一个可视化界面。本文介绍如何使用GitArgocd方式来实现在k8s中部署和更新应用服务。关于ci这一块这里不多介绍。主要讲解argocd如何实…

可视化图解算法:删除有序(排序)链表中重复的元素

1. 题目 描述 删除给出链表中的重复元素&#xff08;链表中元素从小到大有序&#xff09;&#xff0c;使链表中的所有元素都只出现一次 例如&#xff1a; 给出的链表为1→1→2,返回1→2. 给出的链表为1→1→2→3→3返回1→2→3. 数据范围&#xff1a;链表长度满足 0≤n≤100…

ETL:数据清洗、规范化和聚合的重要性

在当今这个数据呈爆炸式增长的时代&#xff0c;数据已成为企业最为宝贵的资产之一。然而&#xff0c;数据的海量增长也伴随着诸多问题&#xff0c;如数据来源多样、结构复杂以及质量问题等&#xff0c;这些问题严重阻碍了数据的有效处理与深度分析。在此背景下&#xff0c;ETL&…

spring boot jwt生成token

1、引入jwt依赖 <!--jwt的依赖--> <dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.18.3</version> </dependency> 2、创建TokenUtils工具类 package com.pn.utils;import com.…

豪越科技:融合低空经济的消防一体化安全管控解决方案

在科技飞速发展的当下&#xff0c;2025 年低空经济正处于规模化商用的关键节点&#xff0c;其在应急救援、物流配送等多领域展现出巨大潜力。豪越科技凭借其先进的消防一体化安全管控方案&#xff0c;与低空经济深度融合&#xff0c;打造出一套更为高效、智能的消防解决方案&am…

清华大学 | DeepSeek第十版!《DeepSeek政务应用场景及解决方案》

清华大学发布的《DeepSeek政务应用场景及解决方案》研究报告&#xff0c;聚焦人工智能技术DeepSeek在政府治理与公共服务中的创新实践&#xff0c;系统阐述了其如何通过智能化技术赋能政务数字化转型&#xff0c;推动治理能力现代化。报告指出&#xff0c;DeepSeek作为融合大数…

R语言双Y轴折线图+相关性注释

目录 包和数据 作图代码及详解 包和数据 rm(list ls()) library(ggpubr) library(scales) library(ggplot2)data <- iris##鸢尾花数据集 data1 <- data[1:30,c(1,2,3)] > head(data1)Sepal.Length Sepal.Width Petal.Length 1 5.1 3.5 …

2024年3月全国计算机等级考试真题(二级C语言)

&#x1f600; 第1题 下列叙述中正确的是 A. 矩阵是非线性结构 B. 数组是长度固定的线性表 C. 对线性表只能作插入与删除运算 D. 线性表中各元素的数据类型可以不同 题目解析&#xff1a; A. 矩阵是非线性结构 错误。矩阵通常是二维数组&#xff0c;属…

基于Ebay拍卖网站成交价格的影响因素分析

摘要:近些年来网上拍卖的不断地发展&#xff0c;网上购物慢慢变成了大家普遍接受的购物方式。因此关于网上拍卖的研究日益成为很多人研究的重点。 影响拍卖网站价格的因素很多&#xff0c;但很少有人分得清楚哪些因素才是比较重要的因素&#xff0c;因此对价格因素分析&#x…