1

我正在尝试使用 list.pointToPosition 来确定用户手指正在触摸的列表项位置。我的列表包含 aTextView后跟 aListView中的 a RelativeLayout。我发现的问题是 pointToPosition 似乎忽略了我有 aTextView并返回项目的错误位置的事实。

让我用一些图片和一些返回的样本来进一步解释。我启用了让我跟踪手指触摸的调试功能。您将在下图中的蓝线中看到它。

在下图中,您会注意到屏幕顶部是一个标有“LIGHTS”的 TextView。就在它下面是我的ListView。查看跟踪我的手指触摸和滑动的蓝线 - 您会注意到它从标有“Front Porch”的行的顶部附近开始。在该位置执行“pointToPosition”会返回正确的值 4。

正确的pointToPosition

但是,现在,如果我在同一行的中途开始触摸,pointToPosition 返回值 5。您可以在以下屏幕截图中看到我的触摸/拖动。

错误的位置

当我将 TextView 的大小更改为 1dp 的高度时,问题就消失了;因此我相信 pointToPosition 方法假定我的 ListView 是页面上唯一的东西。

我可以通过计算由 TextView 引起的偏移量来实现 hack 并处理这个问题,但我的感觉是,当这个错误(假设它是一个错误)得到修复时,这最终会回来咬我。我想知道是否有适当的方法来解决它。

源代码示例:

layout.xml

<com.mls.util.RelativeLayoutTouchInterceptor xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:background="@drawable/app_bg"
android:id="@+id/rlRoot" android:clickable="true"
tools:context=".DeviceListActivity" >

<TextView android:id="@+id/list_header"
          style="?android:listSeparatorTextViewStyle"
          android:text="Lights"
          android:layout_width="match_parent"
          android:layout_height="wrap_content">
</TextView>

<ListView
        android:id="@+id/dlList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="65dp"
        android:layout_below="@+id/list_header"
        android:layout_alignParentLeft="true">
</ListView>

</com.mls.util.RelativeLayoutTouchInterceptor>

RelativeLayoutTouchInterceptor.java

public class RelativeLayoutTouchInterceptor extends RelativeLayout {
    ...

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {

    switch(event.getAction()) {
        case MotionEvent.ACTION_DOWN: {

            downStart = MotionEvent.obtain(event);

            ListView list = (ListView)this.findViewById(R.id.dlList);
            int position = list.pointToPosition((int)downStart.getX(), (int)downStart.getY());
    }

 ...

}
4

2 回答 2

1

发生这种情况的原因是因为您正在覆盖 的onInterceptTouchEventRelativeLayout而不是ListView. 它报告布局本身内的 y 坐标,其中包括TextView.

如果你想获得相对于ListView唯一的坐标,你可以为它ListView本身覆盖它。它是 的间接子类ViewGroup,因此它可以访问该方法。

没有需要修复的错误,它可以正常工作。

于 2013-07-24T22:58:27.650 回答
0

我继续并添加了感知黑客来解决这个问题,将 TextView 的高度添加到提供的 Y 位置pointToPosition

于 2013-07-24T22:22:40.207 回答