gpt4 book ai didi

android - 如何在 ListView 中获取行的位置(在屏幕上)

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:12:19 25 4
gpt4 key购买 nike

我已经实现了一些手势检测代码,这样我就可以检测到我的 ListView (位于 FrameLayout 中)中的一行何时被滑动。

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
int itemId = MainActivity.this.getListView().pointToPosition((int) e1.getX(),(int) e1.getY());
Offer order = (Offer)MainActivity.this.getListView().getAdapter().getItem(itemId);
View v = MainActivity.this.getListView().getChildAt(itemId);
}
}

我想在滑动行的顶部显示一个 View ,其中包含该行的一组上下文相关选项。

我的问题是以下方法:

v.getTop()
v.getBottom()

仅在 View 滚动之前返回正确的值。我可能会做一些计算来使用滚动位置等计算出偏移量,但我也注意到,当我开始滑动屏幕上可见的行时,我只会获得值。如果我向下滚动列表然后滑动一行(最初不是在屏幕外),那么这些方法将返回空值。

下面的方法似乎遇到了同样的问题......

v.getLocationOnScreen(loc)
v.getLocationInWindow(loc)

最终,我希望找到可见 listView 的顶部与已滑动的行之间的距离。然后,我将使用此距离向具有适当高度填充的父 FrameLayout 添加一个 View (以便它覆盖滑动的行)。

如有任何帮助,我们将不胜感激!

最佳答案

有两种不同的索引 ListView 项的方法,一种是按适配器中的位置,另一种是按屏幕上的可见位置。项目将始终位于适配器内的相同位置(除非您更改列表)。 view.getChildAt() 的索引将根据屏幕上可见的内容而有所不同。

pointToPosition 返回的位置是适配器内的位置。如果要获取物理 View ,则需要考虑 View 是否滚动。试试这个:

int adapterIndex = MainActivity.this.getListView().pointToPosition((int) e1.getX(),(int) e1.getY());
int firstViewItemIndex = MainActivity.this.getListView().getFirstVisiblePosition();
int viewIndex = adapterIndex - firstViewItemIndex;
View v = MainActivity.this.getListView().getChildAt(viewIndex);

关于android - 如何在 ListView 中获取行的位置(在屏幕上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2139700/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com