Android RecyclerView AsyncListUtil手动刷新fillData,kotlin

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

Android RecyclerView AsyncListUtil手动刷新fillData,kotlin

    implementation 'com.github.bumptech.glide:glide:4.15.1'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'

Android RecyclerView AsyncListUtil手动刷新fillData,kotlin,kotlin,Android ,android,kotlin

import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.OnScrollListener
import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.google.android.material.snackbar.Snackbar


class MainActivity : AppCompatActivity() {
    companion object {
        const val TAG = "fly"
    }

    private var mRecyclerView: RecyclerView? = null
    private val mItems = ArrayList<MyData>()
    private var fromPos: Int = 0
    private var toPos: Int = 0
    private var startPosition: Int = 0
    private var itemCount: Int = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mRecyclerView = findViewById(R.id.recycler_view)
        mRecyclerView?.layoutManager = GridLayoutManager(this, 3).apply {
            orientation = GridLayoutManager.VERTICAL
        }

        repeat(1000) {
            val data = MyData("-", "-", R.drawable.ic_launcher_background)
            mItems.add(data)
        }

        val mAdapter = MyAdapter(mItems)
        mRecyclerView?.adapter = mAdapter

        MyPagingRecyclerViewUtil.PAGE_SIZE = 50
        var mRecyclerViewUtil = MyPagingRecyclerViewUtil(mRecyclerView!!,
            object : MyPagingRecyclerViewUtil.PagingListener {
                override fun onFillData(
                    data: Array<out Any>, startPosition: Int, itemCount: Int
                ) {
                    this@MainActivity.startPosition = startPosition
                    this@MainActivity.itemCount = itemCount

                    Log.d(TAG, "onFillData $startPosition $itemCount")
                    fillData(startPosition, itemCount)
                }

                override fun onVisibleRange(fromPos: Int, toPos: Int) {
                    this@MainActivity.fromPos = fromPos
                    this@MainActivity.toPos = toPos
                }

                override fun refreshData(): Int {
                    return mItems.size
                }
            })

        mRecyclerView?.addOnScrollListener(object : OnScrollListener() {
            override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                mRecyclerViewUtil?.onRangeChanged()
            }
        })

        //打开即滚到到最后
        mRecyclerView?.scrollToPosition(mAdapter.itemCount - 1)

        val fab: FloatingActionButton = findViewById(R.id.fab)
        fab.setOnClickListener { view ->
            Snackbar.make(
                view,
                "视野:$fromPos->$toPos\n已加载:$startPosition-$itemCount",
                Snackbar.LENGTH_LONG
            ).setAction(
                "点击这里加载视野外:${startPosition - itemCount}-$itemCount",
                object : View.OnClickListener {
                    override fun onClick(v: View?) {
                        fillData(startPosition - itemCount, itemCount)
                    }
                }).show()
        }
    }

    fun fillData(start: Int, count: Int) {
        var pos: Int
        for (i in 0 until count) {
            pos = start + i
            var data = mItems[pos]

            data.pos = "pos:$pos"
            data.text = "text:$pos"
            data.resId = R.drawable.ic_launcher_foreground
        }

        Log.d(TAG, "已加载->$start $count")
        runOnUiThread { mRecyclerView?.adapter?.notifyDataSetChanged() }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    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" />

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="end|bottom"
        android:layout_margin="16dp"
        android:contentDescription="更新"
        android:src="@android:drawable/ic_menu_add" />
</FrameLayout>
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide

class MyAdapter(private var items: ArrayList<MyData>) : RecyclerView.Adapter<MyViewHolder>() {
    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(items?.get(position)?.resId).into(holder.image)
        holder.pos.text = items?.get(position)?.pos
        holder.text.text = items?.get(position)?.text
    }

    override fun getItemCount(): Int {
        return items?.size!!
    }
}

class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    val image: ImageView = itemView.findViewById(R.id.image)
    val pos: TextView = itemView.findViewById(R.id.pos)
    val text: TextView = itemView.findViewById(R.id.text)
}

data class MyData(var pos: String, var text: String, var resId: 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"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:paddingTop="5dp"
    android:paddingBottom="5dp">

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/pos"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="-"
        android:textColor="@android:color/darker_gray"
        android:textSize="15dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/image" />

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="-"
        android:textColor="@color/black"
        android:textSize="12dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/pos" />
</androidx.constraintlayout.widget.ConstraintLayout>
import android.util.Log
import androidx.annotation.UiThread
import androidx.annotation.WorkerThread
import androidx.recyclerview.widget.AsyncListUtil
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView


class MyPagingRecyclerViewUtil(rv: RecyclerView, pagingListener: PagingListener) {
    companion object {
        var PAGE_SIZE = 200
    }

    private var mAsyncListUtil: AsyncListUtil<Any>? = null

    init {
        var viewCallback = PagingViewCallback(rv, pagingListener)
        var dataCallback = PageingDataCallback(pagingListener)
        mAsyncListUtil =
            AsyncListUtil(Any().javaClass, PAGE_SIZE, dataCallback, viewCallback)
    }

    fun onRangeChanged() {
        mAsyncListUtil?.onRangeChanged()
    }

    fun refresh() {
        Log.d(MainActivity.TAG, "refresh")
        mAsyncListUtil?.refresh()
    }

    private class PageingDataCallback(var listener: PagingListener) :
        AsyncListUtil.DataCallback<Any>() {

        // 如果RecyclerView的数据源总长度发生变化,需要更新这个值,
        // 否则getItemRangeInto不会触发新的可视区域range更新。
        override fun refreshData(): Int {
            return listener?.refreshData() ?: 0
        }

        @WorkerThread
        override fun fillData(data: Array<out Any>, startPosition: Int, itemCount: Int) {
            listener?.onFillData(data, startPosition, itemCount)
        }
    }

    private class PagingViewCallback(val recyclerView: RecyclerView, var listener: PagingListener) :
        AsyncListUtil.ViewCallback() {
        fun getOutRange(rv: RecyclerView, outRange: IntArray) {
            outRange[0] = (rv.layoutManager as GridLayoutManager?)!!.findFirstVisibleItemPosition()
            outRange[1] = (rv.layoutManager as GridLayoutManager?)!!.findLastVisibleItemPosition()
        }

        override fun getItemRangeInto(outRange: IntArray) {
            getOutRange(recyclerView, outRange)
            listener?.onVisibleRange(outRange[0], outRange[1])
        }

        override fun onDataRefresh() {
            Log.d(MainActivity.TAG, "onDataRefresh")
        }

        override fun onItemLoaded(position: Int) {
            Log.d(MainActivity.TAG, "onItemLoaded $position")
        }
    }

    interface PagingListener {
        @WorkerThread
        fun onFillData(data: Array<out Any>, startPosition: Int, itemCount: Int) {

        }

        @UiThread
        fun onVisibleRange(fromPos: Int, toPos: Int) {

        }

        fun refreshData(): Int {
            return 0
        }
    }
}

Android RecyclerView paging/pager/page implements based on AsyncListUtil,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/130874429文章来源地址https://www.toymoban.com/news/detail-533987.html

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

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

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

相关文章

  • Springboot 实践(14)spring config 配置与运用--手动刷新

            前文讲解Spring Cloud + zuul 实现了 SpringbootAction-One 和SpringbootAction-two两个项目的路由切换,正确访问到项目中的资源。这两个项目各自拥有一份application.yml项目配置文件,配置文件中有一部分相同的配置参数,如果涉及到修改,需要进行多处修改。那么有没有一种技

    2024年02月09日
    浏览(9)
  • Android开发—RecyclerView使用

    Android开发—RecyclerView使用

    RecyclerView 在Android中用于创建列表。 官网的解释为: RecyclerView 可以让您轻松高效地显示大量数据。您提供数据并定义每个列表项的外观,而 RecyclerView 库会根据需要动态创建元素。 当RecyclerView的列表项滚出屏幕的时候,RecyclerView不会销毁该视图,相反而是将这些视图复用到

    2024年02月16日
    浏览(50)
  • Android RecyclerView使用简述

    Android RecyclerView使用简述

      RecyclerView是Android中非常受欢迎的控件,RecyclerView是官方在Android5.0之后新添加的控件,推出用来替代传统的ListView和GridView列表控件,所以如果你还在使用ListView的话可以替换为RecyclerView了。 文章的功能可以先运行看看效果,APK下载   对于RecyclerView的使用根据实际项目进

    2023年04月08日
    浏览(12)
  • Android RecyclerView 实现瀑布流

    Android RecyclerView 实现瀑布流

    Android RecyclerView 使用大全 - 基础使用,item 动画,下拉刷新等 瀑布流也是个常用的显示控件了,但是在使用时经常遇到一些问题,比如滑动回顶部后出现空隙、item在滑动时乱跳等问题。 下面就来说说我怎么实现的瀑布流,并且怎么处理上面所说的这些问题的。 我使用了原生

    2024年02月09日
    浏览(17)
  • 【Android】Recyclerview的缓存复用

    RecyclerView是Android开发中常用的一个高度可定制的列表视图组件。它是在ListView和GridView的基础上进行了改进和增强,旨在提供更好的性能和更灵活的布局管理。 RecyclerView的主要特点如下: 灵活的布局管理器(LayoutManager): RecyclerView使用LayoutManager来管理其子视图的布局方式。

    2024年02月15日
    浏览(12)
  • Android:RecyclerView自由拖动item

    原生就自带有可拖动item的工具:ItemTouchHelper 看下效果: 可拖动RecyclerView预览效果 接下来我们看如何使用。 其中判断条件中的item.isMovable这边是记录该item是否可以拖动,也可以换成其他判断条件比如根据位置判断等。 另外,需要留意一点,如果你是在onBindViewHolder中有设置点

    2024年01月23日
    浏览(12)
  • Android的UI开发——RecyclerView

    Android的UI开发——RecyclerView

    RecyclerView提供了三种布局管理器即: LinearLayoutManager 线性布局管理器 StaggeredGridLayoutManager 瀑布流布局管理器 GridLayoutManager 网格布局管理器 这三种布局管理器都是通过 setLayoutManager 方法来设置 1.LinearLayoutManager 线性布局管理器 效果如图:         1).新建一个类存放信息。

    2024年02月03日
    浏览(45)
  • Android 使用 RecyclerView 创建动态列表

    Android 使用 RecyclerView 创建动态列表

    记录一下学习过程,RecyclerView 创建动态列表效果如下: Recyclerview 认识 Recyclerview 库: Recyclerview 指南: RecyclerView 可以显示大型数据集,通过回收有限数量的视图可以有效地滚动这些数据集,同时最大限度减少内存用量。 在实例化 ViewHolder 视图时可以定义单击侦听器。 Recy

    2023年04月27日
    浏览(11)
  • Android studio RecyclerView 应用设计

    Android studio RecyclerView 应用设计

    一、创建empty activity项目: 二、打开activity_main.xml布局文件: 添加RecyclerView控件

    2024年01月25日
    浏览(10)
  • nacos 监听配置文件变动(自动刷新),监听服务变动(权重、元数据等),手动推送服务

    对于启动项目时可以检测的配置文件,修改配置文件时也可进入监听,对于服务监听时,项目启动时注册进nacos可以监听,修改服务时关闭服务时都可以监听,也可以手动推送服务到nacos上。 nacos上的配置文件名称为:服务名称-dev.yaml bootstrap.yml

    2024年02月15日
    浏览(13)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包