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

时间:2017-04-05 12:17:51

标签: sqlite android-recyclerview cardview

嘿伙计我有一个recyclerview适配器,它填充了cardview上的一些数据列表。我在卡片布局的右下角创建了一个三点菜单,它实际上会从recyclerview中删除卡片行,并且还会从存储行数据的sqlite数据库中删除该项目。问题是我无法弄清楚如何将实现删除的方法集成到recyclerview ViewHolder中。这是源代码

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


}

如果有人能帮助我,我会很高兴。

1 个答案:

答案 0 :(得分:6)

使用此代码删除同一行点击按钮上的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());
            }

         }
    });