首页 > 解决方案 > RecyclerView 项目的 PopUpWindow 未正常定位

问题描述

好的,我将尽我所能描述问题。

我有RecyclerView一堆ViewHolder物品。

每个ViewHolder都有一个按钮。

我的目标是PopUpWindow在我单击的按钮下方显示一个右侧。

我设置了监听器,我 100% 知道我正在触摸我打算触摸的项目。

问题是,当我触摸向下的物品时,RecyclerView事情变得非常奇怪。

屏幕边界内没有任何东西,所以当我打电话时myPopUp.showAsDropDown(myButton),如果我点击的项目是第一个或第二个项目(我有 2 个 ViewHolders 一次占据屏幕),我可以PopUpWindow正常看到。但是,如果我单击一个不可见的项目,除非我向下滚动,否则PopUpWindow它会显示但它不在屏幕边界,我有点理解为什么但我不知道如何修复它,这是一个错误?

任何帮助将不胜感激,我希望我很清楚,如果我不是,我会扩展,谢谢!

更新:

我在将 View 项目滚动到中间的屏幕时记录了它的坐标,它就像 1200 y 值,而我的屏幕只有 1400。

所以我想我的问题可以改写为,“我怎样才能确保回收站视图中的查看项目根据它们在屏幕上的位置而不是它们在回收站视图中的位置为我提供准确的绝对坐标?

好的,所以经过更多测试后,我看到当我点击该项目时,它给出了正确的绝对坐标,然后当向上滚动第二个项目现在是第一个(视觉上)我点击它时,它给出了类似的绝对坐标-值,这很好。但是当我滚动到第三个项目时,它给了我该项目的原始 y 值,它比预期的要高。

标签: androidandroid-recyclerview

解决方案


您为弹出窗口传递的视图将决定弹出窗口的位置。现在尝试

myPopUp.showAsDropDown(myButton, x, y)

从位置计算得到 x 和 y:

int[] originalPos = new int[2];
itemView.getLocationOnScreen(originalPos);
//or view.getLocationOnScreen(originalPos)
int x = originalPos[0];
int y = originalPos[1];

推荐阅读