首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在回收器视图适配器android Kotlin之外更新ProgressBar

在Android开发中,RecyclerView是一个非常常用的组件,用于显示大量数据列表。RecyclerView.Adapter是用于为RecyclerView提供数据和视图的适配器。ProgressBar通常用于显示任务的进度。

如果你想在RecyclerView的适配器外部更新ProgressBar,可能是因为你在进行一些耗时操作(如网络请求、文件读写等),并且希望在操作进行时显示进度,在操作完成时隐藏进度。

基础概念

  1. RecyclerView: 用于显示大量数据列表的组件。
  2. Adapter: 为RecyclerView提供数据和视图的适配器。
  3. ProgressBar: 用于显示任务进度的组件。

相关优势

  • 异步更新: 可以在后台线程进行耗时操作,避免阻塞UI线程。
  • 用户体验: 用户可以实时看到任务的进度,提升用户体验。

类型

  • 主线程更新: 直接在UI线程更新ProgressBar
  • 异步任务更新: 在后台线程进行耗时操作,并在主线程更新ProgressBar

应用场景

  • 文件下载
  • 数据加载
  • 网络请求

问题及解决方法

问题:为什么在适配器外部更新ProgressBar

通常是因为耗时操作不应该在UI线程进行,否则会导致应用无响应(ANR)。因此,耗时操作会在后台线程进行,而ProgressBar的更新需要在主线程进行。

原因

  • 耗时操作阻塞UI线程。
  • ProgressBar需要在主线程更新。

解决方法

使用HandlerLiveData在主线程更新ProgressBar

示例代码
代码语言:txt
复制
// 在Activity或Fragment中
class MyActivity : AppCompatActivity() {
    private lateinit var progressBar: ProgressBar
    private val handler = Handler(Looper.getMainLooper())

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

        progressBar = findViewById(R.id.progressBar)

        // 启动耗时操作
        startLongRunningTask()
    }

    private fun startLongRunningTask() {
        // 显示进度条
        progressBar.visibility = View.VISIBLE

        // 在后台线程进行耗时操作
        Thread {
            // 模拟耗时操作
            Thread.sleep(5000)

            // 更新UI线程的ProgressBar
            handler.post {
                progressBar.visibility = View.GONE
            }
        }.start()
    }
}

参考链接

通过这种方式,你可以在RecyclerView适配器外部更新ProgressBar,并且确保UI线程不被阻塞。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Kotlin入门(23)适配器的进阶表达

前面介绍列表视图和网格视图时,它们的适配器代码都存在视图持有者ViewHolder,因为Android对列表类视图提供了回收机制,如果某些列表项屏幕上看不到了,则系统会自动回收相应的视图对象。...视图持有者的设计理念固然美好,却苦了Android开发者,每次由BaseAdapter派生新的适配器类,都必须手工处理视图持有者的相关逻辑,实在是个沉重的负担。...现在由Kotlin实现循环视图适配器类,综合前面两小节提到的优化技术,加上视图持有者的自动重用,适配器代码又得到了进一步的精简。...为方便理解循环适配器Kotlin编码,下面以微信的公众号消息列表为例,给出对应的消息列表Kotlin代码: //ViewHolder构造时初始化布局中的控件对象 class RecyclerLinearAdapter...这么神奇的魔法,快来看看Kotlin适配器代码是如何书写的: //利用Kotlin的插件LayoutContainer,适配器中直接使用控件对象,而无需对其进行显式声明 class RecyclerStaggeredAdapter

1.8K41
  • Android 低功耗蓝牙开发(扫描、连接、数据交互)Kotlin

    低功耗蓝牙开发(扫描、连接、数据交互)Kotlin版 前言 正文 一、配置项目 二、页面设计 三、扫描设备 ① 绑定视图 ② 检查Android版本 ③ 打开蓝牙 ④ 请求权限 ⑤ 扫描结果 ⑥ 设备适配器编写...⑦ 数据渲染 ⑧ 开始和停止扫描 四、连接和数据交互 ① 绑定视图 ② 初始化连接 ③ Ble回调 ④ 帮助类 ⑤ UI回调 五、源码 前言   写这篇文章是因为有读者想看看Kotlin中怎么操作低功耗蓝牙...android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/> vector> 下面写扫描到的列表适配器布局文件,layout下新建一个item_bluetooth.xml...⑥ 设备适配器编写 首先我们要定义一个设备类,用来存放扫描到的结果,Kotlin中有一个数据类,来做这个事情,新建一个BleDevice,代码如下: data class BleDevice(var...扫描毫无疑问肯定要展示数据页面上的。然后就需要一个视图来显示数据,之前创建了item的xml文件,现在我们需要写一个适配器去配合这个item的xm去渲染列表数据。

    1.8K20

    Android 低功耗蓝牙开发(扫描、连接、数据交互)Kotlin

    低功耗蓝牙开发(扫描、连接、数据交互)Kotlin版 前言 正文 一、配置项目 二、页面设计 三、扫描设备 ① 绑定视图 ② 检查Android版本 ③ 打开蓝牙 ④ 请求权限 ⑤ 扫描结果 ⑥ 设备适配器编写...⑦ 数据渲染 ⑧ 开始和停止扫描 四、连接和数据交互 ① 绑定视图 ② 初始化连接 ③ Ble回调 ④ 帮助类 ⑤ UI回调 五、源码 前言   写这篇文章是因为有读者想看看Kotlin中怎么操作低功耗蓝牙...android:pathData="M19,13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"/> vector> 下面写扫描到的列表适配器布局文件,layout下新建一个item_bluetooth.xml...⑥ 设备适配器编写 首先我们要定义一个设备类,用来存放扫描到的结果,Kotlin中有一个数据类,来做这个事情,新建一个BleDevice,代码如下: data class BleDevice(var...扫描毫无疑问肯定要展示数据页面上的。然后就需要一个视图来显示数据,之前创建了item的xml文件,现在我们需要写一个适配器去配合这个item的xm去渲染列表数据。

    2.9K31

    Android 应用中使用矢量资源

    这可以防止属性 ID 冲突 —— VectorDrawables 中使用的属性(android:pathData,android:fillColor 等)都有一个整数 ID,这些 ID 是 API...在内部,这些 AppCompat 视图使用 AppCompatResources 来支持加载矢量的加载。...没有 compat 属性的视图 不幸的是,有很多地方你可能想要在不提供 compat 属性的视图上指定 drawables(例如,对于 progressbar 来说没有 indeterminateDrawableCompat...AndroidX 支持显式渲染 元素(也包括动画向量(animated-vector)和动画选择(animated-selectors),但我们今天主要讨论静态 vectors)。...使用 AndroidX 支持既可以更多平台版本和后端功能上使用矢量资源,也可以让你接收任何未来的更新。 现在我们已经理解了为什么以及如何使用向量,下一篇文章将深入探讨如何创建它们。

    1.5K30

    Android 蓝牙开发(扫描设备、绑定、解绑)Kotlin

    ,不过就怕写了没有人看,因为国内Kotlin是受众群体确实比较少,当然了也是有大的方向往这边推动的,但是小公司依然不会去用Kotlin,如果你看不惯我这个说法也不要告诉我。...当然里面的一些其他的图标请到我的源码里面去拿,我就不一一贴出来了 drawable下创建一个名为progressbar.xml的样式文件,代码如下: <?...所以Kotlin中我想到了更简单的办法,直接在MainActivity中修改状态栏样式。...,第二行没有给,这是因为Kotlin中只要一开始做了处理之后后面就可以不用再次处理,当然你加上!!也没有问题。...广播接收   点击扫描蓝牙之后会这行扫描事件,会发送一个广播出去,发送出去了自然要有一个地方来接收,这就是广播接收MainActivity定义一个内部类,通过inner关键字 /**

    4.4K20

    【翻译】Kotlin 1.1 新版本同样适合安卓开发者

    Kotlin for Android Developers》书的作者 Kotlin 1.1 的发布真是激动人心啊!...假设我们有个事件监听需要访问这个视图,我们的适配器类就像下面这样: class MyAdapter(val items: List, val listener: (View) -> Unit...object Hide : UiOp() data class Translate(val axis: Axis, val amount: Int): UiOp() } 现在,封装类可以父类之外定义了...举个例子,文章的前面我解释了如何使用代理更新一个 RecyclerView 的适配器,后面的代码是这样的: var items: List by Delegates.observable...另外,如果你想学习使用 Kotlin 来开发安卓程序,那么你会对《[Kotlin for Android Developers]》(https://antonioleiva.com/kotlin-android-developers-book

    1.1K60

    ApacheCN 安卓译文集 20211225 更新

    十四、安卓对话框窗口 十五、数组、地图和随机数 十六、适配器回收 十七、数据持久化和共享化 十八、本地化 十九、动画和插值 二十、绘制图形 二十一、线程和启动实时绘图应用 二十二、粒子系统和处理屏幕触摸...安卓编程初学者手册 零、前言 一、安卓和 Kotlin 入门 二、Kotlin、XML 和用户界面设计 三、探索 AndroidStudio 和项目结构 四、布局和材质设计入门 五、卡片视图和滚动视图的漂亮布局...十三、让安卓小部件栩栩如生 十四、安卓对话窗口 十五、处理数据和生成随机数 十六、适配器回收 十七、数据持久化和共享 十八、本地化 十九、动画和插值 二十、绘制图形 二十一、线程和启动实时绘图应用...构建安卓应用 零、前言 一、创建您的第一个应用 二、构建用户屏幕流 三、用片段开发用户界面 四、构建应用导航 五、基本库:RetroFit 库、Moshi 库和 Glide 库 六、回收视图 七、...虽然我们追求卓越,但我们并不要求您做到十全十美,因此请不要担心因为翻译上犯错——大部分情况下,我们的服务已经记录所有的翻译,因此您不必担心会因为您的失误遭到无法挽回的破坏。(改编自维基百科)

    7.2K20

    Android 蓝牙开发(扫描设备、绑定、解绑)Kotlin

    前言   之前写了一个蓝牙的小Demo,看的人还是有一些的,也有人私信我说,在学Kotlin,能不能出一版Kotlin的博客讲述这个蓝牙开发,这个想法还是不错的,不过就怕写了没有人看,因为国内Kotlin...是受众群体确实比较少,当然了也是有大的方向往这边推动的,但是小公司依然不会去用Kotlin,如果你看不惯我这个说法也不要告诉我。...下创建一个名为**progressbar.xml**的样式文件,代码如下: <?...所以Kotlin中我想到了更简单的办法,直接在MainActivity中修改状态栏样式。...广播接收   点击扫描蓝牙之后会这行扫描事件,会发送一个广播出去,发送出去了自然要有一个地方来接收,这就是广播接收MainActivity定义一个内部类,通过**inner**关键字 /

    4.6K10

    Kotlin入门(20)几种常见的对话框

    、数组适配器、选择监听、默认选项等等; 我的天,这也太专业了吧,在产品经理看来,这只是个下拉框而已,有必要搞这么复杂吗?...说时迟那时快,Android Studio上面把Spinner上述的Java代码转换为Kotlin,不一会儿就生成了如下的Kotlin代码:         private fun initSpinner...由于这里的Java代码逻辑实在拐弯抹角,又是数组适配器又是选择监听的,因此Kotlin对这种玩意确实没有好办法。...如此方便易用的selector,竟然撇开了数组适配器和选择监听,那么它又是怎么实现的呢?...当然,因为用到了Anko库的扩展函数,所以务必代码头部加上一行导入语句: import org.jetbrains.anko.progressDialog 水平进度对话框弹出之后,若想更新水平条的进度值

    2.8K30

    Kotlin入门(20)几种常见的对话框

    、数组适配器、选择监听、默认选项等等; 我的天,这也太专业了吧,在产品经理看来,这只是个下拉框而已,有必要搞这么复杂吗?...说时迟那时快,Android Studio上面把Spinner上述的Java代码转换为Kotlin,不一会儿就生成了如下的Kotlin代码: private fun initSpinner...由于这里的Java代码逻辑实在拐弯抹角,又是数组适配器又是选择监听的,因此Kotlin对这种玩意确实没有好办法。...如此方便易用的selector,竟然撇开了数组适配器和选择监听,那么它又是怎么实现的呢?...当然,因为用到了Anko库的扩展函数,所以务必代码头部加上一行导入语句: import org.jetbrains.anko.progressDialog 水平进度对话框弹出之后,若想更新水平条的进度值

    1.6K10

    Android MVI框架搭建与使用

    二、网络请求   当我们使用Kotlin时,网络访问就变得更简单了,只需要Retrofit和协程即可,首先我们com.llw.mvidemo包下新建一个data包,然后data包下新建一个model...① 列表适配器   创建适配器之前首先我们需要创建一个适配器所对应的item布局,layout下新建一个item_wallpaper_rv.xml,代码如下图所示: <?...:paddingStart="2dp" android:paddingEnd="2dp" android:visibility="gone" /> <ProgressBar...initView()函数中是控件的一些配置,比如给RecyclerView添加布局管理和设置适配器,给按钮添加点击事件,点击的时候发送意图,发送的意图被MainViewModel中mainIntentChannel...这样就完成了通过状态更新UI的环节,MVI的框架就是这样设计的。

    3.4K40

    Kotlin入门(22)适配器的简单优化

    列表视图 为实现各种排列组合类的视图(包括但不限于Spinner、ListView、GridView等等),Android提供了五花八门的适配器用于组装某个规格的数据,常见的适配器有:数组适配器ArrayAdapter...马上利用Android Studio把上述Java代码转换为Kotlin编码,转换后的Kotlin代码类似以下片段: class PlanetKotlinAdapter(private val mContext...这意味着,上面的控件对象必定是先获得实例,它们被使用的时候肯定是非空的,因此完全可以告诉编译,这些控件对象一定会在使用前赋值,编译您老就高抬贵手,睁一只眼闭一只眼放行好了。...网格视图 在前面的列表视图一小节中,给出了Kotlin改写后的适配器类,通过关键字lateinit固然避免了麻烦的空校验,可是控件对象迟早要初始化的呀,晚赋值不如早赋值。...至此基于BaseAdapter的Kotlin列表适配器告一段落,上述的适配器代码模版,同时适用于列表视图ListView与网格视图GridView。 点此查看Kotlin入门教程的完整目录

    1.3K10

    Jetpack Compose Alpha 版现已发布!

    进而,我们还了解到 Kotlin 深受开发者的喜爱,如今排名前一千名的应用中,有超过 70% 的应用使用了 Kotlin,60% 的专业 Android 开发者都在使用 Kotlin。...UI 组件 性能优化 测试 文本和可编辑文本 主题和图形 Window 管理 与 JetBrains Kotlin 团队 的紧密合作下,我们也为 Android Studio 4.2 canary...从历史上看,Android视图层次结构一直被描述为 UI 组件树。随着 app 状态的变化,需要更新 UI 层次结构来显示当前的数据。...这不仅乏味繁琐,而且手动更新视图也会增加出错的可能性 (例如忘记更新视图)。...借助 Compose 布局预览,您可以预览 Compose 组件,而无需将应用部署到设备或模拟开发应用时,您的预览会更新,以帮助您更快地检查变更。

    4.1K30

    DataBinding最全使用说明

    " android:layout_height="wrap_content"/> Tip: 还支持ObservableParcelable序列化数据类型 上面说的这两种只会视图跟随数据更新...视图刷新数据 通过表达式使用@=表达式就可以视图刷新的时候自动更新数据, 但是要求数据实现以下两种方式修改才会触发刷新 <EditText android:layout_width="match_parent...数据变化(回调监听)触发视图变化, 然后视图又会触发数据变化(再次回调监听), 然后一直循环, 设置相同的数据也视为数据变化....) get (视图到数据) notify (通知Databinding视图已经刷新可以更新数据(Model)了) set函数, 之前已经写过了 @BindingAdapter("android:bindName...查看下生成类中的视图更新数据的实现源码 private android.databinding.InverseBindingListener ivandroidTextAttr = new android.databinding.InverseBindingListener

    2.2K20

    Jetpack Compose Beta 版现已发布!

    ) 及设备或模拟上实时更新文字 动画预览: 检查并播放动画 布局检查中的 Compose 支持 交互式预览: 检查并与单独的 Composable 交互 部署预览: 无需完整应用即可在您的设备上部署...旨在与 Android 视图无缝协作,便于您按照自己的节奏应用该工具包。...您可以 Android 视图中嵌入 Compose UI,并在 Compose 中使用视图。我们 互操作性文档 中提供了多种应用策略。...Compose 会负责应用状态更改时更新您的 UI,这样您无需操作界面就能使其转变为预期状态,省去了繁琐的流程,并且可以避免出错。...我们期待收到您对应用中采用 Compose 的 反馈,您也可以 Kotlin Slack 的 #compose 频道中参与讨论或在下方留言区和我们分享。

    5.6K10
    领券