Android ListView中的OnItemClickListener和OnClickListener

Android ListView中的OnItemClickListener和OnClickListener,android,listview,Android,Listview,我为自定义ListAdapter中的每一行都有一个自定义视图,我正在尝试执行onClick操作并获取列表中单击的行位置 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="matc

我为自定义ListAdapter中的每一行都有一个自定义视图,我正在尝试执行onClick操作并获取列表中单击的行位置

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent"
    android:paddingLeft="10dip" android:id="@+id/itemRoot" android:clickable="false">

    <TextView android:layout_width="wrap_content" android:text="TextView"
        android:layout_height="wrap_content" android:id="@+id/itemTxt"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"></TextView>
    <TextView android:layout_toRightOf="@+id/itemTxt" android:text="TextView"
        android:layout_height="wrap_content" android:layout_alignBottom="@+id/itemTxt"
        android:id="@+id/amountTxt" android:paddingLeft="6dip"
        android:layout_centerVertical="true" android:layout_width="match_parent"></TextView>
    <ImageView android:id="@+id/delBtn" android:layout_height="wrap_content"
        android:src="@drawable/delete" android:layout_width="wrap_content"
        android:layout_alignParentRight="true" android:paddingRight="10dip"
        android:layout_centerVertical="true"></ImageView>

</RelativeLayout>

我想知道什么时候单击TextView或ImageView,我还需要知道它来自列表中的哪一行。我已经尝试过使用McClickListener,它可以很好地获取单击来自的行。但是,一旦我为视图注册了OnClick侦听器,就会跳过oninemclicked()方法并立即执行OnClick(),但是无法获取视图所在的行位置(或者至少我不知道是否)

如果我将视图的clickable设置为false,则会调用OnItemClick get,并尝试对给定视图手动调用performClick()。但这只适用于根元素(RelativeLayout),如果单击来自布局内部的TextView,则单击不会传播

我真的不知道如何在列表中同时获得位置和执行onClick操作

欢迎有任何想法


Alex

您可以从
ListAdapter
的重写
getView
方法中为每个
ImageView
TextView
分配适当的
OnClickListener

在该方法中,您知道项的位置,因此可以将其传递给自定义侦听器类,并根据需要在其中使用它:

@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
    // TODO: instantiate the layout 
    // here I call a super method
    final View view = super.getView(position, convertView, parent);
    final TextView textView = (TextView)view.findViewById(R.id.itemTxt);
    textView.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            Log.i("Click", "TextView clicked on row " + position);
        }
    });
    final ImageView imageView = (ImageView)view.findViewById(R.id.delBtn);
    imageView.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            Log.i("Click", "ImageView clicked on row " + position);
        }
    });
    return view;
}

您需要扩展TextView等,覆盖click方法,执行适当的操作,然后技巧是返回false,以便将其传播到listview。

让OnClickListener与创建活动位于同一类中的另一个可能选项是将OnClickListener添加到活动

public class DisplayListCustom extends Activity implements OnItemClickListener
然后将自定义列表设置为侦听

ListView list = (ListView)findViewById(R.id.custom_list);
list.setClickable(true);
list.setOnItemClickListener(this);
list.setAdapter(new CustomListAdapter(getApplicationContext(), listItems));
最后,在onItemClick返回中,您可以使用资源ID找到内部视图

public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
    LinearLayout listItem = (LinearLayout) v;
    TextView clickedItemView = (TextView) listItem.findViewById(R.id.name);
    String clickedItemString = clickedItemView.getText().toString();
    Log.i("DisplayListCustom", "Click detected " + clickedItemString + ", position " + Integer.toString(position));
public void onItemClick(AdapterView父视图、视图v、整型位置、长id){
LinearLayout列表项=(LinearLayout)v;
TextView clickeditView=(TextView)listItem.findViewById(R.id.name);
String clickedItemString=clickedItemView.getText().toString();
Log.i(“DisplayListCustom”、“Click detected”+clickedItemString+”,位置“+Integer.toString(位置));

这就是我使用的解决方案。我在自定义布局容器中使用了LinearLayout,但我认为这同样适用于RelativeLayout。

在布局中,当相对于另一个视图定位视图时,您应该指定锚定id,而不使用
+
符号:
android:layout\u-toRightOf=“@id/itemTxt”
android:layout\u alignBottom=“@id/itemTxt”
。在为视图创建新id时使用
“@+id/itemTxt”
(因此在
android:id
属性的值中)。所有这些代码都是自动生成的,但我会记住:)AlexI想知道是否有一种方法可以重写,该方法会返回false,并使人误以为事件没有被消耗。谢谢Hanks rekaszeru,这实际上是一个非常简洁的解决方案。很好!我更喜欢这种方法而不是rekaszeru使用的匿名类方法戈斯特德