我正在尝试使用 list.pointToPosition 来确定用户手指正在触摸的列表项位置。我的列表包含 aTextView
后跟 aListView
中的 a RelativeLayout
。我发现的问题是 pointToPosition 似乎忽略了我有 aTextView
并返回项目的错误位置的事实。
让我用一些图片和一些返回的样本来进一步解释。我启用了让我跟踪手指触摸的调试功能。您将在下图中的蓝线中看到它。
在下图中,您会注意到屏幕顶部是一个标有“LIGHTS”的 TextView。就在它下面是我的ListView。查看跟踪我的手指触摸和滑动的蓝线 - 您会注意到它从标有“Front Porch”的行的顶部附近开始。在该位置执行“pointToPosition”会返回正确的值 4。
但是,现在,如果我在同一行的中途开始触摸,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());
}
...
}