今天记录一下,项目中使用recycleView来显示数据,动态更新,写了一大圈才发现问题出在比较简单的地方,这里也给大家提个醒,遇到RecycleView动态更新数据不显示的问题分三步走:
第一步:
progressDevFragment.setVisibility(View.INVISIBLE);
RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
GridLayoutManager layoutManager = new GridLayoutManager(view.getContext(), 1);
recyclerView.setLayoutManager(layoutManager);
if (comStaList.size() == presenter.getDeviceLength() && rtAiList.size() == presenter.getRtaiLength()) {
adapter = new MainAdapter(ghList, comStaList, rtAiList, deviceList);
recyclerView.setAdapter(adapter);
} else {
comStaList.clear();
rtAiList.clear();
comStaList.addAll(presenter.getComstaListData());
rtAiList.addAll(presenter.getRtaiListData());
initAdapter();
}
请忽略没用的代码,关键是你是否使用中间变量List<T>的 .addAll()方法,这里涉及到数据源地址得问题,如果我直接使用
MainAdapter adapter = new MainAdapter(ghList, comStaList, presenter.getComstaListData, deviceList);
后台数据在变化,本地sqlite读取也正常,页面数据就是没法发刷新的。
第二步:
更新数据集后是否使用了
adapter.notifyDataSetChanged();
这个方法的作用就是,监测数据源是否发生变化的。
第三步:
adapter.notifyDataSetChanged();
的使用位置,这个时候问题,如果你是单独开了线程去刷新了数据,那么在刷新后一定要通知UI线程,执行上述方法,办法有几种:
1. runOnUiThread(Runnable action)
注意:context 对象要是 主线程中的MainActivity,这样强转才可以。
runOnUiThread(new Runnable() {
@Override
public void run() {
//此时已在主线程中,更新UI
}
});
2. Handler机制
3. AsyncTask
4. EventBus
@Subscribe(threadMode = ThreadMode.MAIN)
public void Event(MessageEvent messageEvent) {
if (messageEvent.getMessage().equals("refresh")){
adapter.notifyDataSetChanged();
}
}
private void refreshData(){
if (timer == null) {
timer = new Timer();
}
if (task == null) {
task = new TimerTask() {
@Override
public void run() {
try {
initData();
MessageEvent messageEventRefresh = new MessageEvent("refresh");
EventBus.getDefault().post(messageEventRefresh);
} catch (Exception e) {
e.printStackTrace();
}
}
};
}
timer.schedule(task, 0, 15*1000);
}
我项目中用到了EventBus,就用了这种方法,解决了问题,回过头来想想,是有点儿懵了,早该想到的,哈哈!
还是希望大家能快速定位问题解决问题!