我已经实现了一些手势检测代码,以便我可以检测列表视图中的行(位于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);
}
}
Run Code Online (Sandbox Code Playgroud)
我想在滑动行的顶部显示一个视图,其中包含该行的一组上下文相关选项.
我的问题是以下方法:
v.getTop()
v.getBottom()
Run Code Online (Sandbox Code Playgroud)
仅在滚动视图之前返回正确的值.我可以做一些计算来计算使用滚动位置等的偏移量,但我也注意到,当我在屏幕上滑动可见的行时,我只获取值.如果我向下滚动列表然后滑动一行(原来不在屏幕外),则这些方法返回空值.
以下方法似乎遇到了同样的问题......
v.getLocationOnScreen(loc)
v.getLocationInWindow(loc)
Run Code Online (Sandbox Code Playgroud)
最后,我希望找到可见列表顶部与已刷过的行之间的距离.然后,我将使用此距离将父视图添加到具有适当高度填充的父FrameLayout(以便它覆盖滑动的行).
任何帮助将非常感激!
Che*_*mon 17
有两种不同的方法可以通过适配器中的位置或屏幕上的可见位置索引ListView项目.项目将始终位于适配器中的相同位置(除非您更改列表).view.getChildAt()的索引将根据屏幕上可见的内容而有所不同.
pointToPosition返回的位置是适配器中的位置.如果要获取物理视图,则需要考虑是否滚动视图.试试这个:
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);
Run Code Online (Sandbox Code Playgroud)