Handler
或 Timer
定时任务,周期性调用数据加载逻辑并刷新界面。 ,3. 数据驱动:结合 LiveData
或 ViewModel
,数据变化时自动通知UI更新(如 notifyDataSetChanged
)。 ,4. 下拉刷新:集成 SwipeRefreshLayout
,监听刷新事件并重新加载数据后关闭动画。 ,核心需确保数据加载与UI更新在主线程执行,避免阻塞操作
方法 | 适用场景 | 核心原理 | 优点 | 缺点 |
---|---|---|---|---|
LiveData + ViewModel | 数据与UI解耦场景 | 数据变化自动通知观察者 | 生命周期安全 数据倒置方便测试 | 需要架构组件支持 |
Flow/StateFlow | 流式数据处理 | 响应式编程模型 | 背压处理 线程切换灵活 | 学习成本较高 |
DataBinding | 简单数据绑定 | XML声明式绑定 | 减少findViewById 自动双向绑定 | 复杂逻辑仍需代码 |
// 单个View刷新 textView.text = "新数据"
// RecyclerView整体刷新
adapter.notifyDataSetChanged() // 性能消耗大,建议使用notifyItemRangeChanged
2. Handler机制
```kotlin
val handler = Handler(Looper.getMainLooper())
handler.post {
// 执行UI刷新操作
textView.text = "延迟刷新数据"
}
// 网络请求示例 viewModel.fetchData() viewModel.data.observe(this) { newData -> // 更新适配器数据源 adapter.submitList(newData) }
组件 | 刷新方法 | 触发时机 |
---|---|---|
RecyclerView | notifyItemChanged(position) | 数据局部更新 |
Fragment | requireActivity().runOnUiThread {} | 子线程更新UI |
SurfaceView | lockCanvas() → draw() → unlockCanvasAndPost() | 自定义绘制场景 |
DiffUtil
优化RecyclerView更新notifyItemRangeChanged
代替全局刷新Q1:如何在不重建Fragment的情况下刷新其UI?
A:通过viewModel
共享数据,在Activity/Fragment中观察数据变化,示例:
// Fragment中观察数据 viewModel.liveData.observe(viewLifecycleOwner) { data -> binding.textView.text = data.title }
Q2:为什么有时调用notifyDataSetChanged后列表不立即刷新?
A:常见原因及解决方案:
| 原因 | 解决方案 |
|—|—|未真正改变 | 实现equals()
方法或使用新对象 |
| 通知在子线程执行 | 切换到主线程通知 Handler.post {}
|
| Adapter未正确绑定数据 | 检查onBindViewHolder
实现 |