Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android中从listview中删除特定行?_Android_Listview - Fatal编程技术网

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

如何在android中从listview中删除特定行?,android,listview,Android,Listview,说明: 我知道这个问题问了很多次。首先试着理解我的问题。我有一个listview,其中我使用BaseAdapter在我的listivew行上显示动态项,它不是固定的。我删除了包含在该行中的数据,但删除了该行。当我删除一行时,它的数据被完全删除,但不是listview行。我想从列表中删除一行 适配器 public class CartAdapter extends BaseAdapter { private static final String TAG=CartAdapter.clas

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

适配器

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;
    }
}
公共类CartAdapter扩展了BaseAdapter{
私有静态最终字符串标记=CartAdapter.class.getSimpleName();
公共语境;
公共物品清单;
公共场所;充气机;
公共活动;
公共CartAdapter(上下文上下文、列表cartItemList、AppCompatActivity活动){
this.context=上下文;
this.cartItemList=cartItemList;
这个。活动=活动;
充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
}
@凌驾
public int getCount(){
返回此.cartItemList.size();
}
@凌驾
公共对象getItem(int位置){
返回此.cartItemList.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
私家马车夫{
text查看txtItemName、txtItemPrice、txtQtyCount;
图像按钮btnImgDelete;
}
@凌驾
公共视图getView(最终整数位置、视图视图、视图组视图组){
最终车手;
如果(视图==null){
支架=新支架();
视图=充气机。充气(R.layout.cart\u项目,空);
holder.txtItemName=(TextView)view.findViewById(R.id.txt\u item\u name);
holder.txtItemPrice=(TextView)view.findViewById(R.id.txt\u item\u price);
holder.txtQtyCount=(TextView)view.findViewById(R.id.txt\u数量\u计数);
holder.btnImgDelete=(ImageButton)view.findViewById(R.id.btn\u img\u delete);
holder.btnImgDelete.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(最终视图){
final AlertDialog.Builder AlertDialog=新建AlertDialog.Builder(活动,R.style.MyAlertDialogStyle);
alertDialog.setTitle(“删除”);
alertDialog.setIcon(R.drawable.ic\u action\u cancel);
alertDialog.setMessage(“您真的想删除项目吗?”);
alertDialog.setCancelable(真);
alertDialog.setPositiveButton(“确定”,新的DialogInterface.OnClickListener(){
@凌驾
公共void onClick(DialogInterface,inti){
cartItemList。移除(位置);
notifyDataSetChanged();
}
});
alertDialog.setNegativeButton(“取消”,新建DialogInterface.OnClickListener(){
@凌驾
公共void onClick(DialogInterface,inti){
dialogInterface.dismise();
}
});
alertDialog.show();
}
});
视图.设置标签(支架);
}否则{
holder=(CartHolder)视图。getTag();
}
CartItems=cartItemList.get(位置);
holder.txtItemName.setText(cartItems.getItemName());
holder.txtItemPrice.setText(Util.priceTODollar(cartItems.getItemPrice());
holder.txtQtyCount.setText(“+cartItems.getItemQty());
返回视图;
}
}
从列表视图中删除项目前的屏幕截图

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

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


请帮我解决这个问题。

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

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

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);
        }
    }
你的问题是:

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

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

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

请注意,在上面的代码段中,
viewGroup
表示列表视图本身,
view
表示要删除的行。因此,在
onClick
方法中重命名
视图
,这样就不会引起名称冲突。

我的帖子中已经提供了它。在AlertDialog.BuilderIt中,cartItemList.remove(位置)大约只有两行;notifyDataSetChanged();不确定这是否是您的问题,但您的代码
cartItemList.remove(位置)是错误的,因为ListView中的位置发生了变化,并且视图也被重用。你应该把职位保存在持有者中。因为有很多职位你可以在stackoverflow中看到。事实上,当职位发生变化时,在任何区域保留职位都会导致问题。而是将CartItem放在支架中,然后在需要时调用remove(item)。