recyclerView ClickListener在notifyDataSetChanged()之后返回null

时间:2016-09-05 16:27:16

标签: android android-recyclerview notifydatasetchanged

我正在使用recyclerView并从数据库加载数据.recyclelerView项目有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返回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为空,因此点击不起作用。

相同的代码第一次运行良好,一旦我更改了订单,那么点击事件就不起作用,所有其他功能都运行良好。

2 个答案:

答案 0 :(得分:2)

你应该只需要这样做一次:

textlistadapter = new TextListAdapter(getActivity(), allData);
recyclerView.setAdapter(textlistadapter);

稍后,如果您想更新/更改数据,那么您应该执行以下操作:

textlistadapter.setListItems(allData);
textlistadapter.notifyDataSetChanged();

其中setListItems()是适配器中的公共方法,例如:

public void setListItems(List<> allData) {
    this.data.clear();
    this.data.addAll(allData);
}

答案 1 :(得分:0)

很容易理解你做错了什么。您填充一个数组,该数组将为您的适配器提供数据,这意味着,在设置适配器后,如果您希望更改数据,您只需要更改填充数据的数组,并通知适配器数据更改

例如:

myData = db.getData();
myAdapter = new MyAdapter(this,myData);
recyvlerview.setAdapter(myAdapter);

现在每次要更改数据时,只需要更改myData和notifity适配器

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