RecyclerView.Adapter notifyDataSetChanged 无法使用 AsyncTask 回调
RecyclerView.Adapter notifyDataSetChanged not working with AsyncTask Callback
我确定这只是一个简单的故障,但我无法解决。
我的 RecyclerView.Adapter 借助 SQLite 数据库中的 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:如果您需要更多代码,请告诉我,我会提供。
不要使用 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();
}
为了说明背景,我在版本 23.1.1 中使用了 RecyclerView,因为最新的 23.2.0 有一些奇怪的行为,每张卡片都有一个巨大的 space。
//更新:卡片之间 space 的问题,是因为我自己在布局文件中的失败(match_parent 而不是 wrap_content ). -_-
结果再次使用最新版本,一切正常。我不知道为什么,但此刻我很高兴,我可以继续下去。这点小问题,浪费的时间够多了。
也许有人有类似的情况,可以利用这个见解。
谢谢@yUdoDis。
我确定这只是一个简单的故障,但我无法解决。 我的 RecyclerView.Adapter 借助 SQLite 数据库中的 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:如果您需要更多代码,请告诉我,我会提供。
不要使用 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();
}
为了说明背景,我在版本 23.1.1 中使用了 RecyclerView,因为最新的 23.2.0 有一些奇怪的行为,每张卡片都有一个巨大的 space。 //更新:卡片之间 space 的问题,是因为我自己在布局文件中的失败(match_parent 而不是 wrap_content ). -_-
结果再次使用最新版本,一切正常。我不知道为什么,但此刻我很高兴,我可以继续下去。这点小问题,浪费的时间够多了。
也许有人有类似的情况,可以利用这个见解。
谢谢@yUdoDis。