如何在删除的ListView Item位置居中显示自定义Toast?
解决ListView删除Item后在其居中位置显示自定义Toast的问题
嘿,这个问题我之前也踩过坑!你现在用position(Item索引)来设置Toast位置肯定不行,因为索引和屏幕上的实际坐标完全不相关。得换个思路:直接通过被删除的Item视图来获取它在屏幕上的绝对位置,然后计算中心坐标,再把Toast定位到那里。
下面是具体的修改步骤和代码:
1. 修改删除监听器,传入Item视图
首先,把ViewHolder里的itemView(也就是整个Item的视图)传给Toast显示方法,而不是只传position:
private View.OnClickListener onDeleteListener(final int position, final ViewHolder holder) { return new View.OnClickListener() { @Override public void onClick(View v) { // 传入当前要删除的Item视图 showCustomToast(holder.itemView); // 这里别忘了执行你的Item删除逻辑,比如: // yourDataList.remove(position); // notifyItemRemoved(position); } }; }
2. 重写Toast显示方法,基于Item视图计算位置
接下来修改showCustomToast方法,接收Item视图作为参数,然后通过它计算屏幕坐标和中心位置:
public void showCustomToast(View itemView) { LayoutInflater inflater = LayoutInflater.from(context); View layout = inflater.inflate(R.layout.toast_layout, null, false); // 初始化Toast的UI元素(和你原来的代码一致) ImageView icon = layout.findViewById(R.id.toast_image); TextView message = layout.findViewById(R.id.toast_text); LinearLayout fundoMensagem = layout.findViewById(R.id.toast_root); message.setTextColor(Color.BLACK); fundoMensagem.setBackgroundResource(R.color.error_colors); message.setText("Item Deleted!"); Toast toast = new Toast(context); toast.setDuration(Toast.LENGTH_LONG); toast.setView(layout); // 步骤1:获取Item视图在屏幕上的绝对坐标 int[] screenLocation = new int[2]; itemView.getLocationOnScreen(screenLocation); int itemLeft = screenLocation[0]; int itemTop = screenLocation[1]; int itemWidth = itemView.getWidth(); int itemHeight = itemView.getHeight(); // 步骤2:计算Item的中心坐标 int itemCenterX = itemLeft + itemWidth / 2; int itemCenterY = itemTop + itemHeight / 2; // 步骤3:测量Toast视图的宽高(因为还没显示,直接调用getWidth会返回0) layout.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); int toastWidth = layout.getMeasuredWidth(); int toastHeight = layout.getMeasuredHeight(); // 步骤4:设置Toast的位置,让它的中心和Item的中心重合 // Gravity.TOP|Gravity.LEFT 表示以屏幕左上角为基准点 // 偏移量 = Item中心坐标 - Toast自身宽高的一半,这样Toast就居中了 toast.setGravity(Gravity.TOP | Gravity.LEFT, itemCenterX - toastWidth / 2, itemCenterY - toastHeight / 2); toast.show(); }
关键知识点解释
getLocationOnScreen(int[]):这个方法会把视图在整个屏幕上的左上角坐标存入数组,不管ListView有没有滚动,都能拿到当前显示的实际位置。- 手动测量Toast视图:因为Toast还没显示的时候,它的宽高都是0,必须用
measure()方法手动测量,才能准确计算偏移量,保证Toast居中。 setGravity()的逻辑:我们以屏幕左上角为基准,通过偏移量让Toast的中心和Item的中心对齐,这样不管Item在屏幕哪个位置,Toast都会精准显示在它的正中间。
这样修改之后,你删除Item时,自定义Toast就会准确显示在被删除Item的居中位置啦!
内容的提问来源于stack exchange,提问作者V.Salles
相关产品推荐
相关产品推荐

