有幾種情況會進行刷新數據無效
1、數據源前後地址不一樣
一般我們使用構造進行數據源的傳遞,或者是封裝的CommonAdapter進行數據源的傳遞,或者是通過依賴注入框架進行,將數據源進行傳遞到Adapter中,一般容易在這種情況下出現notifyDataSetChanged()方法無效,解決的方法是:
定義一個成員的數據源的變量接受構造傳入的數據,將構造傳入的數據進行mData.addAll(data)的形式,進行將數據綁定。這樣做的目的是 將數據源地址保持不變。
public void setNewData(@Nullable List<T> data) {
this.mData = data == null ? new ArrayList<T>() : data;
notifyDataSetChanged();
}
2、mAdapter在數據加載或者是頁面重啓的時候
地址不一樣,假如Activity中的數據,在別的界面進行添加以後,當回到Activity這個頁面的時候,我們應該刷新數據,但是有時候不會銷燬當前的Activity,所以我們一般在onResume()中進行方法的重寫,重新請求一遍數據,這樣的話,我們的數據會刷新一遍,假如在創建Adapter的時候,沒有做費控判斷,這樣的話,每次執行數據的刷新後,會重新創建一個Adapter,這樣的話,使用mAdapter.notifyDataSetChange()方法,也是沒有任何效果的。
mAdapter = new CommonAdapter<User >(this, R.layout.item_name,
mData) {
@Override
protected void convert(ViewHolder holder, final User u,
final int position) {
holder.setText(R.id.name, t.getName());
}
};
recyclerView.setAdapter(mAdapter);
代碼如上圖所示,沒有任何的錯誤,但是區別是每當數據請求一次或者頁面刷新一次,mAdapter的都會創建一個新的對象,即:也會造成刷新不起作用
3、標準的設置adapter的寫法
項目使用mvp的架構模式的話,請求數據一般都是通過 presenter.getLoadData("0001");
類似這樣的方法進行獲取數據,將數據返回回來以後,在View層中,通過showData()這些方法將數據返回回來,下面貼代碼
@Override
public void showData(List<User> data) {
swipeLayout.setRefreshing(false);
if (data != null) {
mData.clear();
mData.addAll(data);
}
if (mAdapter == null) {
mAdapter = new CommonAdapter<User>(this, R.layout.bgsb_item,
mData) {
@Override
protected void convert(ViewHolder holder, final Usert,
final int position) {
holder.setText(R.id.name, t.getUserName());
holder.setOnClickListener(R.id.tv_bi_delete,
MainActivity.this);
}
};
recyclerView.setAdapter(mAdapter);
} else {
mAdapter.notifyDataSetChanged();
// TODO 待優化,因爲RecyclerView提供notifyItemDataSetChange()方法
}