Android 获取ListView行的id/位置

Android 获取ListView行的id/位置,android,listview,android-arrayadapter,android-adapterview,Android,Listview,Android Arrayadapter,Android Adapterview,我有一个Android ListView,它有很多行。每行包含一个图像和一些文本。如果我单击一行的图像,我要执行操作a,如果我单击行中的任何其他位置,我要执行操作B。这两个操作都需要ListView项的id才能工作 到目前为止,对于操作B,我只使用了listview的onItemClick,从参数中获取id。但是,据我所知,要找出用户单击了行本身中的哪个视图,唯一的方法是向ImageView添加一个onClick事件处理程序来触发动作A。在这种情况下,我只得到单击的视图,而不是ImageView

我有一个Android ListView,它有很多行。每行包含一个图像和一些文本。如果我单击一行的图像,我要执行操作a,如果我单击行中的任何其他位置,我要执行操作B。这两个操作都需要ListView项的id才能工作

到目前为止,对于操作B,我只使用了listview的
onItemClick
,从参数中获取id。但是,据我所知,要找出用户单击了行本身中的哪个视图,唯一的方法是向ImageView添加一个
onClick
事件处理程序来触发动作A。在这种情况下,我只得到单击的视图,而不是ImageView所在行的id


我的问题是-如何从视图对象获取ListView中父行的id?

您可以从适配器的getView()方法为一行中的每个视图设置单击侦听器。

您可以从适配器的getView()方法为一行中的每个视图设置单击侦听器。

您可以在getView()中实现它listview适配器的方法。

您可以在listview适配器的getView()方法中实现它。

@Override
    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1,
            int position, long id)
公共链接(AdapterView arg0、视图arg1、, 内部位置,长id)
在这个方法中,视图arg1为您提供了项目视图,您可以通过这个arg1.findViewById(R.id.content);,找到项目内容;。此处位置为您提供列表视图的项目位置 公共链接(AdapterView arg0、视图arg1、, 内部位置,长id)
在这个方法中,视图arg1为您提供了项目视图,您可以通过这个arg1.findViewById(R.id.content);,找到项目内容;。此处position为您提供列表视图的项目位置。
onItemClickListener
方法有一个
onClick接口
,已将
视图
位置
传递到该接口中:您可以通过执行
开关
语句并在已单击特定视图

例如

更新:这一切归功于年的wwfloyd

在适配器中,对元素应用单击侦听器,然后触发接口方法,这样您就可以识别已单击的注册小部件,然后在
onItemClick中执行以下操作:

public void onItemClick(AdapterView adapterView, View view, int position, long id) {
    long viewId = view.getId();
    switch (viewId) {
       case R.id.someName:
            //widget has been clicked
       break;

       default:
           //row has been clicked
       break;
    }
}

onItemClickListener
方法已经有一个
onClick界面
,其中传递了
视图
位置
:您可以通过执行
开关
语句并在单击特定视图时执行专用操作来检查单击了哪个视图

例如

更新:这一切归功于年的wwfloyd

在适配器中,对元素应用单击侦听器,然后触发接口方法,这样您就可以识别已单击的注册小部件,然后在
onItemClick中执行以下操作:

public void onItemClick(AdapterView adapterView, View view, int position, long id) {
    long viewId = view.getId();
    switch (viewId) {
       case R.id.someName:
            //widget has been clicked
       break;

       default:
           //row has been clicked
       break;
    }
}

如果您没有使用标记,那么您可以

int itemId=...;
OnClickListener customOnClick=...;
imageView.setTag(itemId);
imageView.setOnClickListener(customOnClick);
在自定义的
OnClickListener

int itemId = (Integer) view.getTag();

请注意,您可以将“any”
对象设置为标记,这样您甚至可以设置整个自定义对象,而不仅仅是id

如果您不使用标记,那么您可以

int itemId=...;
OnClickListener customOnClick=...;
imageView.setTag(itemId);
imageView.setOnClickListener(customOnClick);
在自定义的
OnClickListener

int itemId = (Integer) view.getTag();

请注意,您可以将“any”
对象
设置为标记,这样您甚至可以设置整个自定义对象,而不仅仅是id

共享您的代码您拥有的Wriiten共享您的代码您拥有的Wriiten这也是我想到的第一个想法,但不幸的是,作为参数传递的视图并不是我单击的实际UI元素,但是它的父项-项目行的RelativeLayout。这很奇怪,您在其他地方的父项上没有单击逻辑?不,我只是有一个RelativeLayout,它有一个图像视图和一些文本视图。任何元素上都没有onClick处理程序。谢谢,应该可以!您必须显式注册视图才能单击,这真是太奇怪了。很乐意为您提供帮助。奇怪的是,我建议将来使用一个带有您自己自定义界面的RecyclerView,它获取已注册为侦听器的视图,而不是依赖整行。这也是我想到的第一个想法,但不幸的是,作为参数传递的视图不是我单击的实际UI元素,但是它的父项-项目行的RelativeLayout。这很奇怪,您在其他地方的父项上没有单击逻辑?不,我只是有一个RelativeLayout,它有一个图像视图和一些文本视图。任何元素上都没有onClick处理程序。谢谢,应该可以!您必须显式注册视图才能单击,这真是太奇怪了。很乐意为您提供帮助。奇怪的是,我建议将来使用一个带有您自己自定义接口的RecyclerView,它将获得已注册为侦听器的视图,而不是依赖整行。