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);
}