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);但不工作 任何人都建议这样做的想法??

+0

贵handler.deleteCode(codeItem);更新mList?你可以添加deleteCode方法的代码吗? –

+0

public void deleteCode(CodeItem codeItem){ SQLiteDatabase db = this.getWritableDatabase(); db.delete(TABLE_CODE,KEY_CODE +“=?”, new String [] {String.valueOf(codeItem.getStatus())}); db.close(); } 这是删除项目的代码 – AngelJanniee

+0

请参阅下面的答案。因为你的mList没有改变,你的notifyDataSet将不起作用。为了使它工作,填充适配器的列表应该改变。 –

所以,你需要更新你的代码。根据您的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); 

}); 
+0

是的,谢谢@kapsym,在这种情况下,我没有删除列表中的项目。 – AngelJanniee

+1

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

    });