在RecyclerView中通过notifyDataSetChanged发布更新数据

时间:2016-07-06 10:51:02

标签: android android-recyclerview recycler-adapter notifydatasetchanged

我使用Recycler View来显示我的数据列表。我调用了Web服务并从服务器获取数据并使用服务器数据更新当前的 ArrayList 。 这就是我在当前ArrayList中填充数据的方式。

mAlUotesDatas.clear();
mAlUotesDatas = (ArrayList<BillBoardData>) webservice.data;
mUotesAdaptor.notifyDataSetChanged();

并应用 notifyDataSetChanged()以反映数据列表,但它并不反映列表。在mAlUotesDatas中,它会显示更新的数据,但不会显示更新的数据列表。

之后我改变它

mAlUotesDatas.clear();
mAlUotesDatas.addAll(res.data);
mUotesAdaptor.notifyDataSetChanged();

这很好用。令我惊讶的是,这是如何工作的,尽管在Web服务调用之后它们都有更新的数据。

任何人都可以帮助我理解这是怎么回事。?

这是我的班级。

package com.mimran.aphorismus.models;

import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.mimran.aphorismus.R;
import com.mimran.aphorismus.adapters.QuotesAdaptor;

import java.util.ArrayList;

public class DataFragment extends Fragment {

private RecyclerView mRcvQuotes;
private QuotesAdaptor mUotesAdaptor;
private ArrayList<BillBoardData> mAlUotesDatas;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    mRcvQuotes = (RecyclerView) links(R.id.rcv_quotes);
    mUotesAdaptor = new QuotesAdaptor(mContext, mAlUotesDatas);
    mRcvQuotes.setAdapter(mUotesAdaptor);

    return inflater.inflate(R.layout.my_view, container, false);
}

public void webserviceCall() {
    public void onResponse ()
    {
        if (response.isSuccess()) {
            mAlUotesDatas.clear();
            //mAlUotesDatas = (ArrayList<BillBoardData>) res.data;
            mAlUotesDatas.addAll(res.data);
            mUotesAdaptor.notifyDataSetChanged();
        }
    }

}
}

1 个答案:

答案 0 :(得分:2)

它不起作用,因为您没有将项目添加到正确的数据收集实例中。

Adapter在具有特定数据收集实例的构造函数中初始化,并且它一直在处理它。

之后:

 mAlUotesDatas = (ArrayList<BillBoardData>) webservice.data;

mAlUotesDatas是对不同集合的引用,而不是Adapter的实例。

然后:

mUotesAdaptor.notifyDataSetChanged();

实际上会通知适配器有关&#34;旧&#34; 数据集合中未发生变化的更改。

当您使用clearaddAll时,它会起作用,因为您使用的是同一个实例并且您正在替换其中的项目。