Android Glide预加载RecyclerViewPreloader,ViewPreloadSizeProvider,kotlin

Android Glide预加载RecyclerViewPreloader,ViewPreloadSizeProvider,kotlin

 

 implementation 'com.github.bumptech.glide:glide:4.15.1'implementation ("com.github.bumptech.glide:recyclerview-integration:4.14.2") {// Excludes the support library because it's already included by Glide.transitive = false}

 

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

 

 

import android.content.Context
import android.os.Bundle
import android.provider.MediaStore
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.bumptech.glide.ListPreloader
import com.bumptech.glide.RequestBuilder
import com.bumptech.glide.integration.recyclerview.RecyclerViewPreloader
import com.bumptech.glide.util.ViewPreloadSizeProvider
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import java.io.Fileclass MainActivity : AppCompatActivity() {companion object {const val TAG = "fly"}override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)var recyclerView: RecyclerView = findViewById(R.id.recycler_view)recyclerView?.layoutManager = GridLayoutManager(this, 3).apply {orientation = GridLayoutManager.VERTICAL}val adapter = MyAdapter()recyclerView?.adapter = adapterCoroutineScope(Dispatchers.IO).launch {val items = readAllImage(applicationContext)withContext(Dispatchers.Main) {adapter.onChange(items)}}var preloadSizeProvider = ViewPreloadSizeProvider<MyData>()val preloadModelProvider = MyPreloadModelProvider(adapter, this)val preloader = RecyclerViewPreloader(this,preloadModelProvider,preloadSizeProvider,100 //maxPreload预加载数量)recyclerView?.addOnScrollListener(preloader)}class MyPreloadModelProvider(private val adapter: MyAdapter,private val context: Context) : ListPreloader.PreloadModelProvider<MyData> {// 从当前屏幕结束的位置开始,再加载maxPreload条item,// 不可见的item即为屏幕外的position位置// 如果对于一个给定的位置不需要加载任何东西,getPreloadItems 可以返回一个空表。override fun getPreloadItems(position: Int): MutableList<MyData> {val data: MyData = adapter.getItems()[position]Log.d(TAG, "getPreloadItems pos:$position index:${data.index}")return mutableListOf(data)}override fun getPreloadRequestBuilder(item: MyData): RequestBuilder<*>? {Log.d(TAG, "getPreloadRequestBuilder ${item.index}")return Glide.with(context).load(File(item.path))}}class MyAdapter : RecyclerView.Adapter<MyViewHolder>() {private var items: ArrayList<MyData>? = nullfun onChange(items: ArrayList<MyData>?) {this.items = itemsnotifyDataSetChanged()}fun getItems(): ArrayList<MyData> {return items!!}override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {val view = LayoutInflater.from(parent.context).inflate(R.layout.item, parent, false)return MyViewHolder(view)}override fun onBindViewHolder(holder: MyViewHolder, position: Int) {Glide.with(holder.itemView.context).load(File(items?.get(position)?.path)).into(holder.image)}override fun getItemCount(): Int {return items?.size ?: 0}}class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {val image: ImageView = itemView.findViewById(R.id.image)}private fun readAllImage(context: Context): ArrayList<MyData> {val photos = ArrayList<MyData>()//读取手机图片val cursor = context.contentResolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,null,null,null,null)var index = 0while (cursor!!.moveToNext()) {//图片路径val path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA))//图片名称//val name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME))//图片大小//val size = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.SIZE))photos.add(MyData(path, index++))}cursor.close()return photos}class MyData(var path: String, val index: Int)
}

 

 

 

<?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"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recycler_view"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity" /></androidx.constraintlayout.widget.ConstraintLayout>

 

 

<?xml version="1.0" encoding="utf-8"?>
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/image"android:layout_width="100dp"android:layout_height="100dp" />

 

 

 

 

Android Glide自定义AppGlideModule,让Glide在app启动后基于定制化GlideModule加载,kotlin_zhangphil的博客-CSDN博客在实际的开发中,虽然Glide解决了快速加载图片的问题,但还有一个问题悬而未决:比如用户的头像,往往用户的头像是从服务器端读出的一个普通矩形图片,但是现在的设计一般要求在APP端的用户头像显示成圆形头像,那么此时虽然Glide可以加载,但加载出来的是一个矩形,如果要Glide_android 毛玻璃圆角。《Android图片加载与缓存开源框架:Android Glide》Android Glide是一个开源的图片加载和缓存处理的第三方框架。https://blog.csdn.net/zhangphil/article/details/131592226Android load all photos into RecyclerView,pinch to zoom by ScaleGestureDetector,kotlin(4)_zhangphil的博客-CSDN博客Android RecyclerView的StaggeredGridLayoutManager实现交错排列的子元素分组先看实现的结果如图:设计背景:现在的产品对设计的需求越来越多样化,如附录文章2是典型的联系人分组RecyclerView,子元素排列到一个相同的组,但是有些时候,UI要求把这些元素不是垂直方向的,而是像本文开头的图中所示样式排列,这就需要用StaggeredGridLayoutMa。在处理大图的浏览查看动作过程中,往往还有其他额外的事情需要处理,典型的以微信。https://blog.csdn.net/zhangphil/article/details/131296499

Android RecyclerView AsyncListUtil手动刷新fillData,kotlin_zhangphil的博客-CSDN博客基于Android官方Paging Library的RecyclerView分页加载框架我之前写了一篇RecyclerView分页加载机制的文章,是基于Android官方的AsyncListUtil实现的,详情见附录文章1。基于Android官方Paging Library的RecyclerView分页加载框架我之前写了一篇RecyclerView分页加载机制的文章,是基于Android官方的AsyncListUtil实现的,详情见附录文章1。【代码】Android Paging 3,kotlin(1)https://blog.csdn.net/zhangphil/article/details/131519811

 

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

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

相关文章

【新版系统架构】第十二章-信息系统架构设计理论和实践

软考-系统架构设计师知识点提炼-系统架构设计师教程&#xff08;第2版&#xff09; 第一章-绪论第二章-计算机系统基础知识&#xff08;一&#xff09;第二章-计算机系统基础知识&#xff08;二&#xff09;第三章-信息系统基础知识第四章-信息安全技术基础知识第五章-软件工程…

python接口自动化(二十三)--unittest断言——上(详解)

简介 在测试用例中&#xff0c;执行完测试用例后&#xff0c;最后一步是判断测试结果是 pass 还是 fail&#xff0c;自动化测试脚本里面一般把这种生成测试结果的方法称为断言&#xff08;assert&#xff09;。用 unittest 组件测试用例的时候&#xff0c;断言的方法还是很多的…

SpringBoot配置动态定时任务

1.配置ScheduledTask 主要是实现SchedulingConfigurer&#xff0c;动态传入cron。 package com.hzl.boot.config;import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Propert…

多模态系列论文----最详细的多模态论文总结(BLIP、BEIT、CoCa等)

1 多模态概述 多模态指的是多种模态的信息数据&#xff0c;包括&#xff1a;文本、图像、视频、音频等。多模态任务是指需要同时处理两种或多种不同类型的数据的任务。近年来&#xff0c;随着深度学习技术的发展&#xff0c;多模态任务取得了显著的进步。特别是VIT&#xff08…

模拟Toast 自定义提示框

模拟Toast 自定义提示框 前言 为满足产品需求&#xff0c;发现现在的ToastUtils不是太重就是不太满足需求&#xff0c;这边写个简单易用的工具&#xff0c;几十行代码解决的问题,还要啥轮子。 功能如下&#xff1a; 自动消失相对锚点位置 可配置&#xff0c;正中间&#x…

RTOS任务切换过程中堆栈的使用情况

我们知道 Cortex-M3 系列单片机内部有双堆栈机制。即 Cortex‐M3 拥有两个堆栈指针&#xff1a;主堆栈&#xff08;MSP&#xff09;和进程堆栈&#xff08;PSP&#xff09;。任一时刻只能使用其中的一个。通过控制寄存器 CONTROL 中的选择位进行控制。 两个堆栈指针如下&#…

SparkJDBC性能优化指南

前言 本文以Mysql为例。Spark作为一种强大且广泛应用于大数据处理的分布式计算框架,有着出色的性能和可伸缩性。在使用Spark处理大规模数据时,往往需要与关系型数据库MySQL进行交互。然而,由于MySQL和Spark本身的特性之间存在一些差异,直接使用Spark读写MySQL的默认配置可…

JVM理论(一)基础概念

JVM概述 JVM就是二进制字节码的运行环境,负责装载字节码到其内存,解释/编译为对应平台上的机器指令执行,每条java指令在java虚拟机规范中都有详细定义,包括如何取、处理操作数等;JVM特点如下 一次编译,到处运行&#xff08;各CPU的架构不同的情况下JVM为了实现跨平台,字节码指…

WSL2 及 docker开发环境搭建

WSL2 及 docker开发环境搭建 1.使能WSL 控制面板->程序->程序和功能->启动或关闭Windows功能->勾选红框中选项->确认后重启电脑 &#xfeff; 2.下载Linux Kernel Update安装包 下载地址如下&#xff0c; 附件已将下载的安装包作为附件形式上传&#xff0c;…

6月《中国数据库行业分析报告》已发布,首发空间、搜索引擎数据库【全球产业图谱】

为了帮助大家及时了解中国数据库行业发展现状、梳理当前数据库市场环境和产品生态等情况&#xff0c;从2022年4月起&#xff0c;墨天轮社区行业分析研究团队出品将持续每月为大家推出最新《中国数据库行业分析报告》&#xff0c;持续传播数据技术知识、努力促进技术创新与行业生…

高效协作助力企业发展:企业网盘在提升工作效率方面的重要作用!

企业网盘是一种专门为了企业协作工作而设计的在线文档管理平台&#xff0c;受到了众多企业用户的青睐与喜爱。企业网盘如何大幅提高企业协作工作效率&#xff1f; 1、提高文件访问效率 传统的文件共享方式往往使用邮件附件或U盘进行传递&#xff0c;可能会遇到文档版本不一致、…

C语言 - AES软件加解密算法

概述 &#xff08;AES&#xff09;RIJNDAEL算法是一个数据块长度盒密钥长度都可变的分组加密算法&#xff0c;其数据块长度和密钥长度都可独立地选定为大于等于128位且小于等于256位的32位任意倍数。深入学习请参考《密码学》书籍&#xff0c;谢谢各位参阅。 验证环境&#xf…