Android 从另一个onClick方法控件访问ListView控件

Android 从另一个onClick方法控件访问ListView控件,android,onclick,listactivity,Android,Onclick,Listactivity,如何从分配给例如ImageView的onClick方法访问例如TextView?TextView和ImageView组成ListView项 在my item.xml中,我有: <?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:

如何从分配给例如ImageView的onClick方法访问例如TextView?TextView和ImageView组成ListView项

在my item.xml中,我有:

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
> 
<ImageView
    android:id="@+id/img"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:onClick="onImgClick"
    />      
<TextView android:id="@+id/text"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />
</LinearLayout>
但是视图v-这是ImageView,所以在这个方法中我有一个致命的例外:

java.lang.NullPointerException
在线:

tv.setText("Hello world!");

我知道这不是访问TextView的正确方法。我知道我可以根据整个ListView使用onListItemClick(ListView l,View v,int position,long id)。但是我想通过ImageView onClick方法实现这一点。

那么,访问TextView的最简单方法是通过处理程序并使用sendMessage:

或者,根据您实现它的方式,您可能希望查看getParent(),如
v.getParent().findViewById(r.id.text)


不过,我不确定这是否适用于您的情况。

好吧,访问TextView的最简单方法是通过处理程序并使用sendMessage:

或者,根据您实现它的方式,您可能希望查看getParent(),如
v.getParent().findViewById(r.id.text)


但我不确定这是否适用于您的情况。

在onclick侦听器上设置listview的getView方法中的listview。

在onclick侦听器上设置listview的getView方法中的listview。

我建议您覆盖ListAdapter,并在getView()中将侦听器设置为父视图。使用setTag()可以简化标识

LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

...

getView (int position, View convertView, ViewGroup parent){
 LinearLayout thisview = null;
 if(convertView == null){
  convertView = inflater.inflate(R.layout.item, parent);
 }

 TextView tv = convertView.findViewById(R.id.text);

 ImageView img = convertView.findViewById(R.id.img);
 img.setTag("uniqueid_"+position);

 //this will put a reference to the TextView in the ImageView
 img.setKey("TEXT_VIEW", tv);

 img.setOnClickListener(this);
 ...
 return convertView;
}

然后,您可以在onClick()中使用v.getKey(“TEXT_VIEW”)获取TextView。。。但这似乎很有可能导致内存泄漏。

我建议您重写ListAdapter,并在getView()中将侦听器设置为父视图。使用setTag()可以简化标识

LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

...

getView (int position, View convertView, ViewGroup parent){
 LinearLayout thisview = null;
 if(convertView == null){
  convertView = inflater.inflate(R.layout.item, parent);
 }

 TextView tv = convertView.findViewById(R.id.text);

 ImageView img = convertView.findViewById(R.id.img);
 img.setTag("uniqueid_"+position);

 //this will put a reference to the TextView in the ImageView
 img.setKey("TEXT_VIEW", tv);

 img.setOnClickListener(this);
 ...
 return convertView;
}

然后,您可以在onClick()中使用v.getKey(“TEXT_VIEW”)获取TextView。。。但这似乎很有可能导致内存泄漏。

我已经解决了我的问题。我只需在我的LinearLayout上设置id:

android:id="@+id/main_layout"
接下来做些类似的事情:

public void onImgClick(View v) {
    LinearLayout linearLayout = (LinearLayout) v.getParent();       
    TextView textView = (TextView) linearLayout.findViewById(R.id.text);        
    textView.setText("Hello world!");
}

我已经解决了我的问题。我只需在我的LinearLayout上设置id:

android:id="@+id/main_layout"
接下来做些类似的事情:

public void onImgClick(View v) {
    LinearLayout linearLayout = (LinearLayout) v.getParent();       
    TextView textView = (TextView) linearLayout.findViewById(R.id.text);        
    textView.setText("Hello world!");
}

如果ImageView和TextView构成一个listview项目,那么它们是listview中项目的子视图,因此您可以通过父视图访问子视图…您可以实现(我想是的),但onclick方法将仅分配给listview的顶部,而不是所有项目…是的,我可以这样做。或者根据整个ListView使用onListItemClick(ListView l、View v、int-position、long-id)方法。但是我想从ImageView onClick方法中找到解决方案。如果ImageView和TextView形成一个listview项,那么它们是listview中项的子视图,因此您可以通过父视图访问子视图…您可以实现(我想是的),但是onClick方法将仅分配给listview的顶部,而不是所有项…是的,我可以做那样的事。或者根据整个ListView使用onListItemClick(ListView l、View v、int-position、long-id)方法。但是我想从ImageView onClick方法中找到解决方案。到第二个方法:
v.getParent()。
-我这里没有findViewById()方法。顺便说一下,当我这样做时:
Toast.makeText(getApplicationContext(),v.getParent().toString(),0.show()我可以将android.widget.LinearLayout视为父视图。如果我想使用处理程序和sendMessage,我必须在类中声明我的TextView(如果我理解的话)。但是我的ListView中有很多项,当我单击ImageView时,我无法访问ImageView onClick方法中的TextView。对于第二个方法:
v.getParent()。
-我这里没有findViewById()方法。顺便说一下,当我这样做时:
Toast.makeText(getApplicationContext(),v.getParent().toString(),0.show()我可以将android.widget.LinearLayout视为父视图。如果我想使用处理程序和sendMessage,我必须在类中声明我的TextView(如果我理解的话)。但是我有一个列表视图,其中有很多项目,当我单击ImageView时,我无法访问ImageView onClick方法中的TextView。你能给我更多详细信息吗?你是说姆巴恩斯推荐给我的东西吗?你能告诉我更多的细节吗?你是说mbarnes推荐给我的东西吗?但是我如何在我的onImgClick方法中使用getView(int-position,View-convertView,ViewGroup-parent)方法呢?在onImgClick中,我只有一个参数-View。但是在我的onImgClick方法中如何使用getView(int-position,View-convertView,ViewGroup-parent)方法呢?在onImgClick中,我只有一个参数-视图。