android - ListView 中的 OnItemClickListener 和 OnClickListener

标签 android listview

我对自定义 ListAdapter 中的每一行都有一个自定义 View ,我正在尝试执行 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 何时被点击,我还需要知道它来自列表中的哪一行。我已经尝试使用 OnItemClickListener 并且它可以很好地获取点击来自的行。但是,一旦我为 View 注册了 OnClick 监听器,就会跳过 onItemClicked() 方法并立即执行 onClick(),但是无法获取 View 所在的行位置(或者至少不是我知道是否)。

如果我将 View 的 clickable 设置为 false,则会调用 onItemClicked,并且我尝试在给定 View 上手动调用 performClick()。但这仅适用于根元素 (RelativeLayout),如果点击来自布局内的 TextView,则点击不会传播。

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

欢迎任何想法。

亚历克斯

最佳答案

您可以从 ListAdapter 的覆盖 getView 方法。

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

@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;
}

关于android - ListView 中的 OnItemClickListener 和 OnClickListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6090666/

相关文章:

android - CookieManager 中的多个 cookie

android - 如何在 gui 中启动 androidx86?

java - 单例类 : session appears not to be valid sometimes in Android Activity

WPF - 带有按钮的 ListView

android - 如何在 Android ListView Header 上调用点击事件?

java - 从 Android 应用程序触发 javascript

android - 隐藏设备是模拟器的事实?

java - 如何将列乘以ListView中的数字,Android

android - 如何在 BaseAdapter 中刷新 Listview?

c# - WPF ListView 拖动而不取消选择