Получение доступа к элементу управления ListView из другого элемента управления методом onClick

Как я могу получить доступ к, например, TextView из метода onClick, назначенного, например, ImageView? TextView и ImageView составляют элемент ListView.

В моем 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>

И в моем ListActivity у меня есть метод onImgClick:

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

Но View v — это ImageView, поэтому в этом методе у меня есть Fatal Exception:

java.lang.NullPointerException

на линии:

tv.setText("Hello world!");

Я знаю, что это неправильный способ получить доступ к TextView. И я знаю, что могу использовать onListItemClick(ListView l, View v, int position, long id) в соответствии со всем ListView. но я хочу добиться этого с помощью метода ImageView onClick.


person woyaru    schedule 17.07.2011    source источник
comment
Если ImageView и TextView образуют элемент списка, то они являются дочерними представлениями элемента в списке, поэтому вы получаете доступ к дочерним элементам с родительским... Вы можете достичь (я так думаю), но метод onclick будет назначается только в верхней части списка, а не на все элементы...   -  person Nikola Despotoski    schedule 18.07.2011
comment
Да, я могу сделать что-то подобное. Или используйте метод onListItemClick(ListView l, View v, int position, long id) в соответствии со всем ListView. Но я хочу найти решение с помощью метода ImageView onClick.   -  person woyaru    schedule 18.07.2011


Ответы (4)


Я решил свою проблему. Мне нужно только установить идентификатор на моем LinearLayout:

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!");
}
person woyaru    schedule 04.08.2011

Что ж, самый простой способ получить доступ к TextView — через обработчик и использовать sendMessage:

http://developer.android.com/reference/android/os/Handler.html

В качестве альтернативы, в зависимости от того, как вы это реализовали, вы можете захотеть изучить getParent(), как в v.getParent().findViewById(r.id.text);

Я не уверен, что это работает для вашего случая.

person Doa    schedule 17.07.2011
comment
Ко второму методу: v.getParent(). - у меня нет здесь метода findViewById(). Кстати, когда я делаю что-то подобное: Toast.makeText(getApplicationContext(), v.getParent().toString(), 0).show(); я вижу как родительский View android.widget.LinearLayout. - person woyaru; 18.07.2011
comment
Если я хочу использовать Handler и sendMessage, я должен объявить свой TextView в своем классе (если я это понимаю). Но у меня есть ListView с количеством элементов, и когда я нажимаю ImageView, я не могу получить доступ к TextView в методе ImageView onClick. - person woyaru; 18.07.2011

установите для прослушивателя onclick список в методе getView вашего списка.

person Hades    schedule 17.07.2011
comment
Не могли бы вы дать мне более подробную информацию? Вы имеете в виду что-то вроде того, что mbarnes рекомендовал мне? - person woyaru; 18.07.2011

Я рекомендую вам переопределить 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;
}

Затем вы можете получить TextView с помощью v.getKey("TEXT_VIEW") в onClick()... но это похоже на хороший потенциал для утечек памяти.

person mbarnes    schedule 17.07.2011
comment
Но как я могу использовать метод getView (int position, View convertView, ViewGroup parent) в моем методе onImgClick? В onImgClick у меня есть только один параметр — View. - person woyaru; 18.07.2011