Справка по событию onClick() для элемента пользовательского макета строки ListView

У меня есть ListView, строки которого отформатированы мной. Каждая строка имеет сочетание ImageView и TextView. Я также реализовал свой собственный адаптер и могу рисовать через него каждую строку.

Теперь я хотел бы что-то вроде этого-

  • Пользователь нажимает на ImageView (нигде больше в строке, но только этот ImageView должен реагировать на клики)
  • Я узнаю положение строки, в которой был нажат ImageView.

Я пробовал много вещей для этого и хотел, чтобы мой код был максимально эффективным (с точки зрения излишеств). В настоящее время я могу зафиксировать событие щелчка только на этом конкретном ImageView, но я не могу знать, какая строка была нажата.

Я предоставил атрибут в Row XML следующим образом:

<ImageView android:id="@+id/user_image"
    android:padding="5dip" 
    android:layout_height="60dip" 
    android:layout_width="60dip"
    android:clickable="true"
    android:onClick="uImgClickHandler"/> 

И в моем коде у меня есть такой метод:

public void uImgClickHandler(View v){
  Log.d("IMG CLICKED", ""+v.getId());
  LinearLayout parentRow = (LinearLayout)v.getParent();

 }

Я могу получить родительскую строку (возможно), но не знаю, как идти дальше. Может кто-нибудь помочь?


person Aman Alam    schedule 15.11.2010    source источник
comment
Чего именно вы хотели бы добиться? Вы хотите установить некоторые свойства для виджетов других строк?   -  person Vincent Mimoun-Prat    schedule 15.11.2010
comment
Я хотел, чтобы пользователь нажимал только на изображение, а не где-либо еще в строке, и на основе щелкнутого изображения я хотел узнать положение строки, а затем выполнить поиск в источнике данных в этой позиции, получить некоторые информацию и начать другое действие. Кстати, это очень решается следующим ответом.   -  person Aman Alam    schedule 15.11.2010


Ответы (4)


Пожалуйста, обратитесь к этому,
я просто пишу код, чтобы дать вам представление, не в правильном формате

 class youaddaper extends BaseAdapter{

   public View getView(int position, View convertView, ViewGroup parent){
        LayoutInflater inflate = LayoutInflater.from(context);
        View v = inflate.inflate(id, parent, false);

      ImageView imageview = (ImageView) v.findViewById(R.id.imageView);
        imageview.setOnClickListener(new imageViewClickListener(position));
      //you can pass what ever to this class you want,
      //i mean, you can use array(postion) as per the logic you need to implement 
   }
   class imageViewClickListener implements OnClickListener {
   int position;
    public imageViewClickListener( int pos)
        {
            this.position = pos;
        }

    public void onClick(View v) {
      {// you can write the code what happens for the that click and 
       // you will get the selected row index in position
     }
}

}

Надеюсь, это помогло вам

person Labeeb Panampullan    schedule 15.11.2010
comment
Хороший. это действительно помогло. Я собираюсь попробовать это. - person Aman Alam; 15.11.2010
comment
Это сработало. Но может добавить некоторые накладные расходы, поскольку он разделяет объекты для каждого изображения. оптимизирует его позже. Благодарность! :) - person Aman Alam; 15.11.2010
comment
Это также сработало для меня. Меня интересует ваш комментарий о создании отдельных объектов и о том, как это лучше сделать. Несколько примеров, которые я видел, всегда создают объекты слушателя внутри. - person Eugene van der Merwe; 24.02.2011

Другой вариант — использовать методы setTag() и getTag() представления. Вы устанавливаете его в своем getView следующим образом:

imageView.setTag(new Integer(position));

Затем в onClick() вы можете найти тег по:

Integer tag = v.getTag();

Затем это будет использоваться для сопоставления представления изображения с позицией элемента списка.

Обратите внимание, что этот подход создаст проблемы, если представление списка может потерять элементы из середины, так что позиции элементов изменятся в течение времени существования представления списка.

person HYS    schedule 09.09.2013

вы можете просто сделать так: в методе getview нашего адаптера Button btn1 = (Button) convertView.findViewById(R.id.btn1); btn1.setOnClickListener(mActivity);

далее вы можете обработать событие onclick в своей деятельности, для контекста действия здесь mActivity просто передайте это в конструкторе адаптера и приведите его сюда в действие, например MyActivity mActivity=(MyActivity)context; в адаптере. спасибо

person Devendra Singh    schedule 24.12.2012
comment
Это допустимый вариант, но когда эта кнопка нажата и управление передается моему центральному методу, находящемуся в действии, у него не будет достаточно информации о том, в какой строке находится эта кнопка, что усложняет задачу. - person Aman Alam; 26.12.2012

Похоже, это работает в ListActivity, макет элемента которого содержит ImageView с android:onClick="editImage":

public void editImage(View v) {
        int[] loc = new int[2];
        v.getLocationInWindow(loc);
        int pos = getListView().pointToPosition(loc[0], loc[1]);
        Cursor c = (Cursor) adapter.getItem(pos);
        // c now points at the data row corresponding to the clicked row
}
person Miki Habryn    schedule 18.08.2013