RecycleView的notifyDataSetChanged()方法無效

有幾種情況會進行刷新數據無效

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()方法
        }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章