如何从android中的listview中删除特定行?

时间:2016-07-25 05:03:44

标签: android listview

说明:            我知道这个问题不是。时间。首先尝试理解我的问题。我有一个列表视图,其中我使用BaseAdapter在我的listivew行上显示动态项目并且它不是固定的。我删除了行中包含的数据但删除了行。当我删除一行时,它的数据被完全删除但不是列表视图行。我想从列表中删除一个特定的行。

适配器

public class CartAdapter extends BaseAdapter {

    private static final String TAG=CartAdapter.class.getSimpleName();

    public Context context;
    public List<CartItems> cartItemList;
    public LayoutInflater inflater;
    public AppCompatActivity activity;

    public CartAdapter(Context context, List<CartItems> cartItemList,AppCompatActivity activity) {
        this.context = context;
        this.cartItemList = cartItemList;
        this.activity=activity;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return this.cartItemList.size();
    }

    @Override
    public Object getItem(int position) {
        return this.cartItemList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }


    private class CartHolder {
        TextView txtItemName, txtItemPrice, txtQtyCount;
        ImageButton btnImgDelete;
    }

    @Override
    public View getView(final int position, View view, ViewGroup viewGroup) {

        final CartHolder holder;
        if (view == null) {
            holder = new CartHolder();
            view = inflater.inflate(R.layout.cart_items, null);

            holder.txtItemName = (TextView) view.findViewById(R.id.txt_item_name);
            holder.txtItemPrice = (TextView) view.findViewById(R.id.txt_item_price);
            holder.txtQtyCount = (TextView) view.findViewById(R.id.txt_qty_count);

            holder.btnImgDelete=(ImageButton)view.findViewById(R.id.btn_img_delete);

            holder.btnImgDelete.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(final View view) {
                    final AlertDialog.Builder alertDialog=new AlertDialog.Builder(activity,R.style.MyAlertDialogStyle);
                    alertDialog.setTitle("Delete");
                    alertDialog.setIcon(R.drawable.ic_action_cancel);
                    alertDialog.setMessage("Do you really want to delete item??");
                    alertDialog.setCancelable(true);
                    alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            cartItemList.remove(position);
                            notifyDataSetChanged();
                        }
                    });
                    alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            dialogInterface.dismiss();
                        }
                    });
                    alertDialog.show();
                }
            });
            view.setTag(holder);
        } else {
            holder = (CartHolder) view.getTag();
        }

        CartItems cartItems = cartItemList.get(position);
        holder.txtItemName.setText(cartItems.getItemName());
        holder.txtItemPrice.setText(Util.priceTODollar(cartItems.getItemPrice()));
        holder.txtQtyCount.setText("" + cartItems.getItemQty());


        return view;
    }
}

从列表视图中删除项目之前的屏幕截图

enter image description here

从列表视图中删除项目后的屏幕截图

enter image description here

在第二个屏幕截图中,第二个项目已删除但白色背景颜色保持不变。

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:1)

最后,我找到了解决方案。经过多方努力尝试。我不确定这是否是可行的解决方案。

从适配器中删除一个项目后,我设置了处理程序并将捆绑器传递给Message对象,如下所示:

holder.btnImgDelete.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(final View view) {
                    final AlertDialog.Builder alertDialog=new AlertDialog.Builder(activity,R.style.MyAlertDialogStyle);
                    alertDialog.setTitle("Delete");
                    alertDialog.setIcon(R.drawable.ic_action_cancel);
                    alertDialog.setMessage("Do you really want to delete item??");
                    alertDialog.setCancelable(true);
                    alertDialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            if(cartItemList.remove(cartItems)) {
                                notifyDataSetChanged();

                                Message message=new Message();
                                Bundle bundle=new Bundle();
                                bundle.putSerializable("KEY",(Serializable)cartItemList);
                                message.setData(bundle);
                                activity.uiHomeHandler.sendMessage(message);
                            }
                        }
                    });
                    alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int i) {
                            dialogInterface.dismiss();
                        }
                    });
                    alertDialog.show();
                }
            });

在活动中,我再次将cartitemList对象设置为baseAdapter,并在删除项目后再次调用它

SuppressLint("HandlerLeak")
    public class UiHandler extends Handler {
        @Override
        public void handleMessage(final Message msg) {
            super.handleMessage(msg);
            Bundle b=msg.getData();
            cartItemList=(List)b.getSerializable("KEY");

            mCartAdapter=new CartAdapter(getApplicationContext(),cartItemList,CartActivity.this);
            lvCartItem.setAdapter(mCartAdapter);
            Helper.getListViewSize(lvCartItem);
        }
    }

答案 1 :(得分:0)

你的问题在这里:

cartItemList.remove(position);

正如您所知,为了提高性能,在列表视图中,当它们离开屏幕时,行将为recycled。因此,当您初始化一行(view == null方法中的getView)时,您实际上不知道分配给该行的位置,因为此行可以分配多个不同的位置。

为了正确找到位置,您应该使用列表视图的getPositionForView方法。因此,在您的onClick监听器中,用以下代码替换您的代码:

int p = ((ListView) viewGroup).getPositionForView(view);
cartItemList.remove(p);
notifyDataSetChanged();

请注意,在上面的代码段中,viewGroup表示列表视图本身,view表示要删除的行。因此,重命名view方法中的onClick,以免造成名称冲突。

相关问题