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