Android Glide预加载RecyclerViewPreloader,ViewPreloadSizeProvider,kotlin

这篇具有很好参考价值的文章主要介绍了Android Glide预加载RecyclerViewPreloader,ViewPreloadSizeProvider,kotlin。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android Glide预加载RecyclerViewPreloader,ViewPreloadSizeProvider,kotlin

 文章来源地址https://www.toymoban.com/news/detail-550724.html

 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.File


class 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 = adapter

        CoroutineScope(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>? = null

        fun onChange(items: ArrayList<MyData>?) {
            this.items = items
            notifyDataSetChanged()
        }

        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 = 0
        while (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.RecyclerView
        android: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

 

到了这里,关于Android Glide预加载RecyclerViewPreloader,ViewPreloadSizeProvider,kotlin的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android使用Glide类加载服务器中的图片

    Glide类用于从服务器中获取图片并加载进ImageView。 一、添加依赖 Glide为 第三方框架 ,使用时需添加依赖: 在 Gradle Scripts / build.gradle(Module:app) / dependencies方法 中添加 添加后会下载。 二、获取权限 获取服务器中的图片需要 申请(静态声明)网络权限 ,在清单文件中添加 三、

    2024年02月06日
    浏览(44)
  • Android应用:实现网络加载商品数据【OKHttp、Glide、Gson】

    实现网络加载商品数据的功能: 1、在AndroidManifest.xml中声明网络权限; 2、在app/build.gradle中添加okhttp, glide, gson等必需的第3方库; 3、在MainActivity中通过OkHttpClient连接给定的Web服务,获取商品数据;对应的json数据为本地的json文件,名字为goods_list_data.json;数据内容为:[ {“id”

    2024年02月08日
    浏览(59)
  • Android Glide自定义AppGlideModule,让Glide在app启动后基于定制化GlideModule加载,kotlin

    Android Glide自定义AppGlideModule,让Glide在app启动后基于定制化GlideModule加载,kotlin   project的build.gradle:     app的build.gradle:       注解定义GlideModule   重新build项目。此后在项目代码中使用:GlideApp.  替代  Glide.  加载load图即可,自定义module就会触发使用。           Android图

    2024年02月13日
    浏览(45)
  • Android GridLayoutManager Glide批量加载Bitmap绘制Canvas画在RecyclerView,Kotlin(a)

    有一个遗留问题,每行加载16张图片,以行为原子单位。后面可以考虑另外一种实现,group分组标签单独占一行,图片可以一大片一大片的占据多行,每行16张。 Android Glide自定义AppCompatImageView切分成若干小格子,每个小格子onDraw绘制Bitmap,Kotlin(1)_android appcompatimageview-CSDN博

    2024年04月17日
    浏览(44)
  • Android Glide preload RecyclerView切入后台不可见再切换可见只加载当前视野可见区域item图片,Kotlin

    build.gradle文件: 如果手机图片很多,假设已经将全部图片装入宫格的列表,在快速上下滑动过程中,由于glide会累积每一个图片的加载任务,如果图片比较大,上下滑动时间又很长,那么累积任务会很严重,导致异常发生,实现在RecyclerView切入后台(或不可见)时候,然后再

    2024年02月10日
    浏览(49)
  • Android优化RecyclerView图片展示:Glide成堆加载批量Bitmap在RecyclerView成片绘制Canvas,Kotlin(b)

    对 Android GridLayoutManager Glide批量加载Bitmap绘制Canvas画在RecyclerView,Kotlin(a)-CSDN博客 改进,用Glide批量把Bitmap加载出来,然后在RecyclerView成片成堆的绘制Canvas,此种实现是RecyclerView加载多宫格图片展示,卡顿丢帧最低的一种实现,上下滑动流畅。 Android GridLayoutManager Glide批量

    2024年04月25日
    浏览(44)
  • Glide无法正常加载图片

    当使用Glide框架加载图片时,可能会遇到加载失败的情况,导致图片无法正常显示,原因有很多。 以下是我的报错信息: 我加载的图片时一张https的图片,分析得知是证书问题,所以我这的解决方案是忽略https证书校验,只需在Application的onCreate()调用一下以下方法。 还有一种

    2024年02月13日
    浏览(46)
  • Glide 加载webp动图

    前提 公司新需求要求视频封面加载动图,但是由于Gif上传的图片过大,所以为了节省开销,对图片进行了处理,最后给到客户端的是webp格式的图片链接。 1.验证webp格式的图片链接是否是动图,测试时,将链接直接使用电脑浏览器加载查看即可 2.app如何加载webp动图,上网搜索

    2024年02月07日
    浏览(75)
  • Glide图片加载框架是如何确定图片加载的生命周期

    Glide基本使用方式:Glide.with(context).load(url).into(imageView); Glide 最基本的用法就是三步走:先with(),再load(),最后into()。 那么我们开始一步步阅读这三步走的源码,先从with()看起。 1. with() with()方法是Glide 类中的一组静态方法,它有好几个方法重载,我们来看一下Glide 类中所 有

    2024年02月01日
    浏览(46)
  • 解决:Glide 在回调中再次加载图片报错

    Glide 加载图片时监听了回调,并在失败时再次加载其它图片后报错。 代码: 异常日志: hander.post 一下:

    2024年02月22日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包