RecyclerView.Adapter notifyDataSetChanged不使用AsyncTask回调

时间:2016-03-03 20:50:53

标签: callback android-adapter android-recyclerview recycler-adapter

我确信这只是一个简单的错误,但我无法解决它。 我的RecyclerView.Adapter借助SQLite DB中的AsyncTask(LoadAllPersonsFromDb)加载其数据。响应由回调接口(ILoadPersonFromDb.onFindAll)处理。

以下是适配器的代码:

public class ListViewAdapter extends RecyclerView.Adapter<ListViewViewholder> implements LoadAllPersonsFromDb.ILoadPersonFromDb {

private int layout;
private List<Person> persons;
private Context context;
private AdapterDataSetListener adapterDataSetListener;

public ListViewAdapter(int layout, Context context,
                       AdapterDataSetListener adapterDataSetListener) {
    this.layout = layout;
    persons = new ArrayList<>();
    this.context = context;
    this.adapterDataSetListener = adapterDataSetListener;
    new LoadAllPersonsFromDb(context, this).execute();
}

@Override
public ListViewViewholder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false);
    return new ListViewViewholder(view, context);
}

@Override
public void onBindViewHolder(ListViewViewholder holder, int position) {
    holder.assignData(persons.get(position));
}

@Override
public int getItemCount() {
    return persons.size();
}

@Override
public void onFindAll(List<Person> persons) {
    Log.d("LISTVIEW", "Counted: " + persons.size() + " elements in db");
    if (this.persons != null) {
        this.persons.clear();
        this.persons.addAll(persons);
    } else {
        this.persons = persons;
    }
    adapterDataSetListener.onChangeDataSet();
    //notifyDataSetChanged();
}

public interface AdapterDataSetListener {
    void onChangeDataSet();
}

}

正如您所看到的,我尝试了多种方法来让它运行。简单的notifyDataSetChanged没有做任何事情,所以我创建了另一个接口,用于将ui信息委托给相关片段。以下代码文档此接口在相关片段中实现:

@Override
public void onChangeDataSet() {
    Log.d("Callback", "called");
    listViewAdapter.notifyDataSetChanged();
    /*
    getActivity().runOnUiThread(new Runnable() {
        @Override
        public void run() {
            listViewAdapter.notifyDataSetChanged();
        }
    });
    */
}

在这里,我也尝试将它放在MainUiThread上,但没有任何效果。我只是无法看到我的问题所在。希望你们中的任何人都能给我一个提示。

日志记录工作,这是工作回调的证明。

提前谢谢。

PS:如果您需要更多代码,请告诉我,我会提供。

2 个答案:

答案 0 :(得分:0)

而不是使用interface-llistener模式,试试这个

@Override
public void onFindAll(List<Person> persons) {
    Log.d("LISTVIEW", "Counted: " + persons.size() + " elements in db");
    if (this.persons != null) {
        this.persons.clear();
        this.persons.addAll(persons);
    } else {
        this.persons = persons;
    }
    refereshAdapter(persons);
}

public void refereshAdapter(List<Person> persons){
        listViewAdapter.clear();
        listViewAdapter.addAll(persons);
        listViewAdapter.notifyDataSetChanged();
}

答案 1 :(得分:0)

为了说明背景,我在版本23.1.1中使用了RecyclerView,因为最新的23.2.0在为每张卡占据巨大空间时有一些奇怪的行为。 //更新:卡之间的空间问题,是因为我自己在布局文件中失败了( match_parent而不是wrap_content )。 -_-

结果是再次使用最新版本,一切正常。我不知道为什么,但此刻我很高兴,我可以继续。这个小问题浪费了足够的时间。

也许有人有类似的情况,可以使用这种见解。

无论如何都是@yUdoDis。