常见场景与实现方式
静态控件数据更换(如TextView、ImageView)
控件类型 |
实现方式 |
示例代码 |
TextView |
通过setText() 直接修改文本 |
textView.setText("新数据") |
ImageView |
通过setImageResource() 或load 替换图片 |
imageView.setImageResource(R.drawable.new_img)<br>//或Glide/Picasso动态加载 |
列表类控件数据更换(RecyclerView/ListView)
控件类型 |
核心方法 |
关键步骤 |
RecyclerView |
Adapter.notifyDataSetChanged() |
修改数据源 调用notify 方法 |
ListView |
Adapter.notifyDataSetChanged() |
同RecyclerView逻辑 |
复杂布局整体刷新(含多个控件)
技术方案 |
适用场景 |
示例代码 |
ViewModel+LiveData |
数据驱动型界面 |
liveData.postValue(newData)<br>//观察者自动更新UI |
Fragment事务 |
需要保留状态的场景 |
fragmentTransaction.replace(R.id.container, newFragment) |
数据绑定方案对比
方案 |
优点 |
缺点 |
适用场景 |
手动findViewById |
简单直接 |
耦合度高 |
少量静态控件更新 |
DataBinding |
自动绑定 |
学习成本 |
数据与视图强关联 |
ViewModel+LiveData |
解耦性好 |
需要架构支持 |
组件化开发 |
DiffUtil |
局部更新 |
需自定义回调 |
大数据量列表 |
异步数据更新处理
数据来源 |
处理方式 |
注意事项 |
网络请求 |
使用Lifecycle感知组件 |
防止内存泄漏 |
数据库 |
结合Room+LiveData |
自动触发UI更新 |
文件IO |
子线程处理+主线程更新 |
使用Handler或runOnUiThread |
性能优化建议
- 局部更新:优先使用
notifyItemRangeChanged()
代替全局刷新
- View复用:RecyclerView预取机制减少创建开销
- 异步加载:对图片等耗时资源使用分级加载策略
- 内存管理:及时解除未使用资源的引用
问题与解答
Q1:如何保留RecyclerView滚动位置的同时更新数据?
A1:在更新前记录当前位置:
int firstVisible = ((LinearLayoutManager)recyclerView.getLayoutManager()).findFirstVisibleItemPosition();
updateData(); //执行数据更新
recyclerView.scrollToPosition(firstVisible);
Q2:ViewModel数据更新后如何保证UI同步?
A2:通过LiveData观察者机制:
//ViewModel
private MutableLiveData<String> data = new MutableLiveData<>();
public void updateData(String newData){
data.setValue(newData);
}
//Activity/Fragment
viewModel.data.observe(this, newData -> {
textView.setText(newData);
});