recyclerView ClickListener return 在 notifyDataSetChanged() 之后为空
recyclerView ClickListener return null after notifyDataSetChanged()
我正在使用 recyclerView 并从 database.The 加载数据 recyclerView 项目有 2 个按钮。对于以下代码,recyclerView 加载正常并且点击工作正常。
allData=db.getCatData(CATEGORYLIST_CIDD,1);
textlistadapter = new TextListAdapter(getActivity(), allData);
recyclerView.setAdapter(textlistadapter);
稍后我重新排列适配器数据以使用此代码按降序显示数据
db=new DatabaseHandler(getActivity().getApplicationContext());
allData=db.getCatData(CATEGORYLIST_CIDD,order_id);
textlistadapter = new TextListAdapter(getActivity(), allData);
recyclerView.setAdapter(textlistadapter);
textlistadapter.notifyDataSetChanged();
现在项目在recyclerView上重新排列,但是onShareButtonClickListener returns null,这里是适配器的代码。
private OnShareButtonClickListener onShareButtonClickListener;
public interface OnShareButtonClickListener {
void onItemClick(View view, Pojo obj, int position);
}
public void setOnShareButtonClickListener(final OnShareButtonClickListener onShareButtonClickListener) {
this.onShareButtonClickListener = onShareButtonClickListener;
}
点击监听代码在这里
holder.bt_share.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Snackbar.make(view, "Share Clicked", Snackbar.LENGTH_SHORT).show();
if (onShareButtonClickListener != null) {
onShareButtonClickListener.onItemClick(view, c, position);
}
}
});
点击无效,因为 onShareButtonClickListener 为空。
相同的代码第一次运行良好,一旦我更改顺序,点击事件就不起作用,所有其他功能都运行良好。
很容易理解你做错了什么。您填充一个数组,它将为您的适配器提供数据,这意味着,在设置适配器之后,如果您希望它的数据发生变化,您只需要更改您填充数据的数组,并通知适配器数据更改.
例如:
myData = db.getData();
myAdapter = new MyAdapter(this,myData);
recyvlerview.setAdapter(myAdapter);
现在每次要更改数据时,只需更改 myData 并通知适配器
myAdapter.notifyDataSetChange();
基本上不是这样做:
db=new DatabaseHandler(getActivity().getApplicationContext());
allData=db.getCatData(CATEGORYLIST_CIDD,order_id);
textlistadapter = new TextListAdapter(getActivity(), allData);
recyclerView.setAdapter(textlistadapter);
textlistadapter.notifyDataSetChanged();
这应该足够了
db=new DatabaseHandler(getActivity().getApplicationContext());
allData=db.getCatData(CATEGORYLIST_CIDD,order_id);
textlistadapter.notifyDataSetChanged();
您应该只需要执行一次:
textlistadapter = new TextListAdapter(getActivity(), allData);
recyclerView.setAdapter(textlistadapter);
稍后,如果你想 update/change 数据,那么你应该这样做:
textlistadapter.setListItems(allData);
textlistadapter.notifyDataSetChanged();
其中 setListItems()
是适配器中的 public 方法,例如:
public void setListItems(List<> allData) {
this.data.clear();
this.data.addAll(allData);
}
我正在使用 recyclerView 并从 database.The 加载数据 recyclerView 项目有 2 个按钮。对于以下代码,recyclerView 加载正常并且点击工作正常。
allData=db.getCatData(CATEGORYLIST_CIDD,1);
textlistadapter = new TextListAdapter(getActivity(), allData);
recyclerView.setAdapter(textlistadapter);
稍后我重新排列适配器数据以使用此代码按降序显示数据
db=new DatabaseHandler(getActivity().getApplicationContext());
allData=db.getCatData(CATEGORYLIST_CIDD,order_id);
textlistadapter = new TextListAdapter(getActivity(), allData);
recyclerView.setAdapter(textlistadapter);
textlistadapter.notifyDataSetChanged();
现在项目在recyclerView上重新排列,但是onShareButtonClickListener returns null,这里是适配器的代码。
private OnShareButtonClickListener onShareButtonClickListener;
public interface OnShareButtonClickListener {
void onItemClick(View view, Pojo obj, int position);
}
public void setOnShareButtonClickListener(final OnShareButtonClickListener onShareButtonClickListener) {
this.onShareButtonClickListener = onShareButtonClickListener;
}
点击监听代码在这里
holder.bt_share.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Snackbar.make(view, "Share Clicked", Snackbar.LENGTH_SHORT).show();
if (onShareButtonClickListener != null) {
onShareButtonClickListener.onItemClick(view, c, position);
}
}
});
点击无效,因为 onShareButtonClickListener 为空。
相同的代码第一次运行良好,一旦我更改顺序,点击事件就不起作用,所有其他功能都运行良好。
很容易理解你做错了什么。您填充一个数组,它将为您的适配器提供数据,这意味着,在设置适配器之后,如果您希望它的数据发生变化,您只需要更改您填充数据的数组,并通知适配器数据更改.
例如:
myData = db.getData();
myAdapter = new MyAdapter(this,myData);
recyvlerview.setAdapter(myAdapter);
现在每次要更改数据时,只需更改 myData 并通知适配器
myAdapter.notifyDataSetChange();
基本上不是这样做:
db=new DatabaseHandler(getActivity().getApplicationContext());
allData=db.getCatData(CATEGORYLIST_CIDD,order_id);
textlistadapter = new TextListAdapter(getActivity(), allData);
recyclerView.setAdapter(textlistadapter);
textlistadapter.notifyDataSetChanged();
这应该足够了
db=new DatabaseHandler(getActivity().getApplicationContext());
allData=db.getCatData(CATEGORYLIST_CIDD,order_id);
textlistadapter.notifyDataSetChanged();
您应该只需要执行一次:
textlistadapter = new TextListAdapter(getActivity(), allData);
recyclerView.setAdapter(textlistadapter);
稍后,如果你想 update/change 数据,那么你应该这样做:
textlistadapter.setListItems(allData);
textlistadapter.notifyDataSetChanged();
其中 setListItems()
是适配器中的 public 方法,例如:
public void setListItems(List<> allData) {
this.data.clear();
this.data.addAll(allData);
}