我的android应用程序中有一个列表视图,如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp" >
<TextView
android:id="@+id/listname"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.5"
android:text="@+id/label"
android:textSize="50px" >
</TextView>
<TextView
android:id="@+id/listcurrent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.2"
android:text="@+id/label"
android:textSize="50px" >
</TextView>
<TextView
android:id="@+id/listoffset"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="0.2"
android:text="@+id/label"
android:textSize="50px" >
</TextView>
<ImageView
android:id="@+id/logo"
android:layout_width="100px"
android:layout_height="100px"
android:layout_marginLeft="5px"
android:layout_marginRight="20px"
android:layout_marginTop="5px"
android:layout_weight="0.1"
android:src="@drawable/icon4" >
</ImageView>
</LinearLayout>
由一些ArrayAdapter
填充。同样在主活动中,我设置了一个侦听器来检测是否正在单击其中一个列表:
this.list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parentAdapter, View view, int position,
long id) {
Log.i("MainActivity", "test");
// We know the View is a TextView so we can cast it
TextView clickedView = (TextView) view.findViewById(R.id.listname);
Toast.makeText(MainActivity.this, "Item with id [" + id + "] - Position [" + position + "] - Planet [" + clickedView.getText() + "]", Toast.LENGTH_SHORT).show();
}
});
其中this.list
是列表。到目前为止一切正常,我看到包含4列的行; 3个文本和一个带图像。当我点击一行中的任何位置时,我会告诉我刚刚单击了哪一行。到目前为止一切都很好!
但是如何确定我点击的列?我是否点击了第一个TextView
?我点击了图片吗?怎么找出来?
答案 0 :(得分:1)
但是如何确定我点击的列?我点击了吗? 第一个TextView?我点击了图片吗?怎么找出来?
如果您对此类信息感兴趣,那么您需要在您感兴趣的每个组件上设置View.OnClickListener
。您可能想要一种方法来检索行中包含的信息,{{1}调用callback。如果是这种情况,则必须使用getView
中的位置标记单个视图。这样,您始终可以通过该位置的ListView
数据集项检索
答案 1 :(得分:0)
前段时间我通过继承ListView
来挂钩触摸事件并存储触摸坐标以便稍后在OnItemClickListener
中使用它来解决这个问题:
private class MyListView extends ListView {
public int lastDonwX;
public int lastDownY;
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
lastDownX = ev.getX();
lastDownY = ev.getY();
return super.onInterceptTouchEvent(ev);
}
}
...
this.list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parentAdapter, View view, int position, long id) {
...
int clickX = ((MyListView)parentAdapter).lastDownX - view.getLeft();
ViewGroup vg = (ViewGroup) view;
for (int i = 0, count = vg.getChildCount(); i < count; i++){
View v = vg.getChildAt(i);
if (v.getLeft() <= clickX && v.getRight() > clickX){
//This is the item clicked, do something with it
...
break;
}
}
}
}
鉴于仅在触摸标记仅移动一点时才注册了点击,您可以使用开始触摸手势位置来接收OnItemClickListener
中的触摸坐标。虽然上面的解决方案很简单 - 它没有考虑到多次触摸 - 但我确信你理解这个概念。
这肯定比注册大量点击侦听器更好,并且没有任何副作用,例如破坏的标准处理代码。