说明: 我知道这个问题不是。时间。首先尝试理解我的问题。我有一个列表视图,其中我使用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;
}
}
从列表视图中删除项目之前的屏幕截图
从列表视图中删除项目后的屏幕截图
在第二个屏幕截图中,第二个项目已删除但白色背景颜色保持不变。
请帮我解决这个问题。
答案 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
,以免造成名称冲突。