Sqlite 如何以编程方式删除RecyclerView中的行

Sqlite 如何以编程方式删除RecyclerView中的行,sqlite,android-recyclerview,cardview,Sqlite,Android Recyclerview,Cardview,嘿,伙计们,我有一个recyclerview适配器,可以填充cardview上的一些数据列表。我在卡片布局的右下角创建了一个三点菜单,实际上可以从recyclerview中删除卡片行,还可以从存储行数据的sqlite数据库中删除该项。问题是我不知道如何将实现delete的方法集成到recyclerviewviewholder中。这是源代码 public class BeneficiaryRecyclerAdapter extends RecyclerView.Adapter<Benefic

嘿,伙计们,我有一个recyclerview适配器,可以填充cardview上的一些数据列表。我在卡片布局的右下角创建了一个三点菜单,实际上可以从recyclerview中删除卡片行,还可以从存储行数据的sqlite数据库中删除该项。问题是我不知道如何将实现delete的方法集成到recyclerviewviewholder中。这是源代码

public class BeneficiaryRecyclerAdapter extends RecyclerView.Adapter<BeneficiaryRecyclerAdapter.BeneficiaryViewHolder> {

private List<Beneficiary> listBeneficiary;
public ImageView overflow;
private Context mContext;

public BeneficiaryRecyclerAdapter(){

}


public BeneficiaryRecyclerAdapter(List<Beneficiary> listBeneficiary, Context mContext) {
    this.listBeneficiary = listBeneficiary;
    this.mContext = mContext;

}


@Override
public BeneficiaryViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // inflating recycler item view
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.item_beneficiary_recycler, parent, false);

    return new BeneficiaryViewHolder(itemView);
}

@Override
public void onBindViewHolder(final BeneficiaryViewHolder holder, int position) {
    holder.textViewName.setText(listBeneficiary.get(position).getName());
    holder.textViewEmail.setText(listBeneficiary.get(position).getEmail());
    holder.textViewAddress.setText(listBeneficiary.get(position).getAddress());
    holder.textViewCountry.setText(listBeneficiary.get(position).getAddress());

    holder.overflow.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            showPopupMenu(holder.overflow);
        }
    });
}

/**
 * Showing popup menu when tapping on 3 dots
 */
private void showPopupMenu(View view) {
    // inflate menu
    PopupMenu popup = new PopupMenu(this.mContext, view);
    MenuInflater inflater = popup.getMenuInflater();
    inflater.inflate(R.menu.beneficiary_m, popup.getMenu());
    popup.setOnMenuItemClickListener(new MyMenuItemClickListener());
    popup.show();
}


//NOTE: The method that would delete the item from the database and recyclerview but i need this method to be called from the onMenuItemClick of the case with id of case R.id.action_delete_beneficiary

public void deleteItem(final BeneficiaryViewHolder holder, int position) {
    final DatabaseHelper2 db = new DatabaseHelper2(mContext);
    db.open();
    db.deleteContact(position);
    db.close();
    listBeneficiary.remove(position);
    notifyItemRemoved(position);
    notifyItemRangeChanged(position, listBeneficiary.size());
    holder.itemView.setVisibility(View.GONE);
}



/**
 * Click listener for popup menu items
 */
class MyMenuItemClickListener implements PopupMenu.OnMenuItemClickListener {


    public MyMenuItemClickListener() {
    }

    @Override
    public boolean onMenuItemClick(MenuItem menuItem) {

        switch (menuItem.getItemId()) {
            case R.id.action_delete_beneficiary:
                Toast.makeText(mContext, "deleting beneficiary", Toast.LENGTH_SHORT).show();
                return true;
            case R.id.action_edit_beneficiary:
                Toast.makeText(mContext, "editing beneficiary", Toast.LENGTH_SHORT).show();
                return true;
            default:
        }
        return false;
    }


}


@Override
public int getItemCount() {
    Log.v(BeneficiaryRecyclerAdapter.class.getSimpleName(),""+listBeneficiary.size());
    return listBeneficiary.size();
}


/**
 * ViewHolder class
 */
public class BeneficiaryViewHolder extends RecyclerView.ViewHolder {

    public AppCompatTextView textViewName;
    public AppCompatTextView textViewEmail;
    public AppCompatTextView textViewAddress;
    public AppCompatTextView textViewCountry;
    public  ImageView overflow;

    public BeneficiaryViewHolder(View view) {
        super(view);
        textViewName = (AppCompatTextView) view.findViewById(R.id.textViewName);
        textViewEmail = (AppCompatTextView) view.findViewById(R.id.textViewEmail);
        textViewAddress = (AppCompatTextView) view.findViewById(R.id.textViewAddress);
        textViewCountry = (AppCompatTextView) view.findViewById(R.id.textViewCountry);
        overflow = (ImageView) view.findViewById(R.id.overflow);
    }
}


}
公共类受益人RecyclerAdapter扩展了RecyclerView.Adapter{
私人名单受益人;
公共图像视图溢出;
私有上下文;
公共受益人RecyclerAdapter(){
}
公共受益人RecyclerAdapter(列表受益人,上下文mContext){
this.list受益人=list受益人;
this.mContext=mContext;
}
@凌驾
公共受益人ViewHolder onCreateViewHolder(视图组父级,int-viewType){
//正在膨胀的回收器项目视图
View itemView=LayoutInflater.from(parent.getContext())
.充气(R.layout.item\u受益人\u回收商,母公司,假);
返回新受益人视图(itemView);
}
@凌驾
BindViewHolder上的公共作废(最终受益人股东,内部职位){
holder.textViewName.setText(listRecipient.get(position.getName());
holder.textViewEmail.setText(listRecipient.get(position.getEmail());
holder.textViewAddress.setText(listRecipient.get(position.getAddress());
holder.textViewCountry.setText(listRecipient.get(position.getAddress());
holder.overflow.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
showPopupMenu(holder.overflow);
}
});
}
/**
*点击3个点时显示弹出菜单
*/
私有void显示弹出菜单(视图){
//充气菜单
PopupMenu popup=新建PopupMenu(this.mContext,view);
MenuInflater充气器=弹出窗口。getMenuInflater();
充气器。充气(R.menu.m,popup.getMenu());
setOnMenuItemClickListener(新的MyMenuItemClickListener());
popup.show();
}
//注意:将从数据库和recyclerview中删除项目的方法,但我需要从id为case R.id.action\u delete\u的案例的onMenuItemClick调用此方法
公共无效删除项(最终受益人股东持有人,内部职位){
final DatabaseHelper2 db=新的DatabaseHelper2(mContext);
db.open();
db.删除触点(位置);
db.close();
移除(位置);
已移除(位置)的项目;
notifyItemRangeChanged(位置,listRecipient.size());
holder.itemView.setVisibility(View.GONE);
}
/**
*单击listener以查看弹出菜单项
*/
类MyMenuItemClickListener实现PopupMenu.OnMenuItemClickListener{
公共MyMenuItemClickListener(){
}
@凌驾
公共布尔onMenuItemClick(MenuItem MenuItem){
开关(menuItem.getItemId()){
案例R.id.行动\删除\受益人:
Toast.makeText(mContext,“删除受益人”,Toast.LENGTH_SHORT.show();
返回true;
案例R.id.action\u edit\u受益人:
Toast.makeText(mContext,“编辑受益人”,Toast.LENGTH_SHORT.show();
返回true;
违约:
}
返回false;
}
}
@凌驾
public int getItemCount(){
Log.v(受益人RecyclerAdapter.class.getSimpleName(),“”+ListRecyclerAdapter.size());
返回listRecipient.size();
}
/**
*视图持有者类
*/
公共类受益人ViewHolder扩展了RecyclerView.ViewHolder{
公共AppCompatTextView textViewName;
公共appcompatitextview textview电子邮件;
公共AppCompatTextView textViewAddress;
公共应用程序兼容文本视图文本视图国家/地区;
公共图像视图溢出;
公共受益人股东(视图){
超级(视图);
textViewName=(AppCompatTextView)view.findViewById(R.id.textViewName);
textViewEmail=(AppCompatTextView)view.findViewById(R.id.textViewEmail);
textViewAddress=(AppCompatTextView)view.findViewById(R.id.textViewAddress);
textViewCountry=(AppCompatTextView)view.findViewById(R.id.textViewCountry);
溢出=(ImageView)view.findViewById(R.id.overflow);
}
}
}

如果有人能帮助我,我将非常高兴。

使用此代码删除同一行上的recyclerview项单击按钮

 holder.deleteImg.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(list.size()!=0){
                list.remove(position);
                notifyItemRemoved(position);
                notifyItemRangeChanged(position,list.size());
            }

         }
    });

使用此代码删除同一行上的recyclerview项单击按钮

 holder.deleteImg.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(list.size()!=0){
                list.remove(position);
                notifyItemRemoved(position);
                notifyItemRangeChanged(position,list.size());
            }

         }
    });

你暗示我应该用删除图像来替换三点菜单,但我实际上想将onMenuItemClick方法中的删除与case R.id.action\u delete\u受益人:包括Toast消息“受益人已删除”替换为我的代码Toast.makeText(mContext,“删除受益人”),Toast.LENGTH_SHORT)show();你暗示我应该用删除图像来替换三点菜单,但我实际上想将onMenuItemClick方法中的删除与case R.id.action\u delete\u受益人:包括Toast消息“受益人已删除”替换为我的代码Toast.makeText(mContext,“删除受益人”),Toast.LENGTH_SHORT)show();