Recyclerview notifyDataSetChanged();不工作
我试图再次删除RecyclerView的项目和更新列表这里回收不更新删除的项目后使用下面的代码Recyclerview notifyDataSetChanged();不工作
public class ScannedCodesAdapter extends RecyclerView.Adapter<ScannedCodesAdapter.ViewHolder> {
private List<CodeItem> mList;
private Context mContext;
private OnItemClickListener mClick;
public ScannedCodesAdapter(List<CodeItem> list, Context context, OnItemClickListener click) {
mList = list;
mContext = context;
mClick = click;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ScanProductCodeItemBinding mBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()),
R.layout.scan_product_code_item, parent, false);
return new ViewHolder(mBinding);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
CodeItem item = mList.get(position);
String code = item.getCode();
holder.binding.adapterCode.setText(code);
int num = position + 1;
if (mList != null)
holder.binding.adapterNum.setText(num + " ");
if ((position % 2) == 0) {
holder.itemView.setBackgroundResource(R.color.white);
} else {
holder.itemView.setBackgroundResource(R.color.color2);
}
if (item.selected) {
holder.binding.adapterDelete.setVisibility(View.VISIBLE);
} else {
holder.binding.adapterDelete.setVisibility(View.GONE);
}
holder.itemView.setOnClickListener(view -> {
for (CodeItem m : mList) {
m.selected = false;
}
item.selected = true;
notifyDataSetChanged();
});
holder.binding.adapterDelete.setOnClickListener(view ->
{
// mClick.onClick(view, position);
//notifyItemRemoved(position);
SQLiteDataBaseHandler handler = new SQLiteDataBaseHandler(mContext);
CodeItem codeItem = handler.getCodeItem(code);
if (item != null) {
handler.deleteCode(codeItem);
notifyDataSetChanged();
});
}
@Override
public int getItemCount() {
return mList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
ScanProductCodeItemBinding binding;
public ViewHolder(ScanProductCodeItemBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
}
。 如果我回去只来更新列表。我也尝试过OnItemClickListener从活动中删除。 notifyDataSetChanged();我试过这个,我也试过notifyItemRemoved(position);但不工作 任何人都建议这样做的想法??
所以,你需要更新你的代码。根据您的deleteCode
方法,您的mList在删除时不会被修改。 notifyDataSetChanged
仅在填充适配器的基础列表发生更改时才有效。
所以,你需要更新你的mList
调用notifyDataSetChanged
所以修改代码之前为 -
holder.binding.adapterDelete.setOnClickListener(view ->
{
//Remove from list
mList.remove(position);
notifyDataSetChanged();
//...delete from db ...
SQLiteDataBaseHandler handler = new SQLiteDataBaseHandler(mContext);
CodeItem codeItem = handler.getCodeItem(code);
if (item != null) {
handler.deleteCode(codeItem);
});
是的,谢谢@kapsym,在这种情况下,我没有删除列表中的项目。 – AngelJanniee
@AngelJanniee很棒。乐于帮助 :) –
您的数据List<CodeItem> mList
在拨打notifyDataSetChanged
之前未被修改。拨打notifyDataSetChanged
之前,从列表中删除专用项目。
holder.binding.adapterDelete.setOnClickListener(view ->
{
//Remove from list
mList.remove(position);
notifyDataSetChanged();
//...delete from db ...
SQLiteDataBaseHandler handler = new SQLiteDataBaseHandler(mContext);
CodeItem codeItem = handler.getCodeItem(code);
if (item != null) {
handler.deleteCode(codeItem);
});
贵handler.deleteCode(codeItem);更新mList?你可以添加deleteCode方法的代码吗? –
public void deleteCode(CodeItem codeItem){ SQLiteDatabase db = this.getWritableDatabase(); db.delete(TABLE_CODE,KEY_CODE +“=?”, new String [] {String.valueOf(codeItem.getStatus())}); db.close(); } 这是删除项目的代码 – AngelJanniee
请参阅下面的答案。因为你的mList没有改变,你的notifyDataSet将不起作用。为了使它工作,填充适配器的列表应该改变。 –