文章目录
- 一、引言
- 二、解决方案
- 1、需求一
- 2、需求二
- (1)普通方法
- (2)观察者模式(推荐)
一、引言
- 描述:如何在主线程(Activity/Fragment)UI中修改子线程(Adapter)的内容
- 难度:初级
- 知识点:
1、Adapter适配器
2、ViewModel观察者模式 - 需求:
1、点击List列表更新Adapter(例)
2、局外UI添加数据(例)
二、解决方案
有些初学者看了有点懵,就需要先将同栏目下的Adapter三种常见的适配器熟悉一遍。
1、需求一
// 主线程获取到的数据
List<Data> list;
// 触发点击事件的方法
@NonNull
@Override
public Adapter.ViewHolder onCreateViewHolder(@NonNull final ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter,parent,false);
final FileAdapter.ViewHolder holder = new FileAdapter.ViewHolder(view);
// 点击事件
holder.fileView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 获取到当前列的数据
int position = holder.getAdapterPosition();
Data data = listUFile.get(position); // 点击值
// -----以下步骤为如何通过data获取更新的数据,我就不写了----
List<Data> nowList = nowListData(data); // nowListData为获取新数据的方法
// --------------------------------------------------------
// 更替数据
list = new ArrayList<>();
list.addAll(nowList);
notifyDataSetChanged();
}
});
return holder;
}
2、需求二
(1)普通方法
- 第一步,在Adapter中定义一个方法
// 主线程获取到的数据
List<Data> list;
public void update(List<Data> nowList) {
list = new ArrayList<>();
if (nowList != null) {
list.addAll(nowList);
}
}
public void update(Data data) {
List<Data> updateList = new ArrayList<>();
updateList.addAll(list);
updateList.add(data);
list = new ArrayList<>();
list.addAll(updateList);
}
- 第二步,主线程(Activity/Fragment)传递数据
// 定义适配器对象
private Adapter adapter;
// 主线程的一些操作....比如:数据绑定、渲染、适配器初始化
// 触发主线程的一些事件(点击、长按等)传递数据
private void onclick() {
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 获取到新数据list
List<Data> list = getNowListData();
adapter.update(list);
// 或者封装得到新实体Data
Data data = getAddData();
adapter.update(data);
}
});
}
(2)观察者模式(推荐)
这里会要使用到发布-订阅的模式,Android中的ViewModel,看不懂的可以先从本栏目中的Fragment(碎片)中ViewModel的使用学习起
- 效果视频
实现过程
- 第一步,定义一个XXViewModel
public class DataViewModel extends ViewModel {
private MutableLiveData<List<Data>> mData;
public LiveData<List<Data>> getListData() {
mData = new MutableLiveData<>();
List<Data> list = getData();
// todo 需要排序算法和分页算法
mData.setValue(list);
return mData;
}
/**
* 获取数据
*/
public List<Data> setData() {
// 关于List<Data>的数据,数据库读取、网络读取...
}
/**
* 更新数据
*/
public void setData() {
Log.i("Data", "修改数据");
List<Data> list = new ArrayList<>(); // 遍历当前好友的聊天数据
list = setData(); // 再次获取到的数据(有所修改)
mChatInfo.postValue(list);
}
}
- 第二步,触发事件
private DataViewModel dataViewModel; // 数据绑定对象,观察者
private Adapter adapter; // 适配器
private RecyclerView data; // UI控件
// ....主函数
// 布局初始化
private void setChatInfoAdapter() {
StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(1,StaggeredGridLayoutManager.VERTICAL);
data.setLayoutManager(layoutManager);
dataViewModel.getData().observe(this, new Observer<List<Data>>() {
@Override
public void onChanged(List<Data> list) {
adapter = new Adapter(list);
data.setAdapter(adapter);
}
});
}
// 主线程触发事件
private void onclick() {
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dataViewModel.setData();
}
});
}