0

我相信这只是一个简单的错误,但我无法解决它。 My RecyclerView.Adapter在AsyncTask(LoadAllPersonsFromDb)的帮助下从SQLite数据库中加载其数据。响应由回调接口(ILoadPersonFromDb.onFindAll)处理。RecyclerView.Adapter notifyDataSetChanged不能用AsyncTask回调

这里是适配器的代码:

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:如果您需要更多的代码,请告诉我,我会提供它。的

回答

0

说句大背景下,我用RecyclerView在23.1.1版本,因为最新的23.2.0已经举办了巨大的空间中的一些怪异的行为为每张卡片。 //更新:卡之间的空间问题,是因为布局文件中的自己失败(match_parent而不是wrap_content)。 -_-

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

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

Thx无论如何@yUdoDis。

0

,而不是使用接口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(); 
} 
相关问题