OnItemClickListener потребляет события onClickListener - PullRequest
4 голосов
/ 12 октября 2011

Я читал о проблемах, которые onClickListener будет использовать для событий onItemClickListener, таких как здесь или здесь . Моя проблема как раз в другом:

У меня CustomAdapter расширяет ArrayAdapter, где я размещаю объекты модели для генерации строки. В разделе «Моя активность» я зарегистрировал onItemClickListener примерно так

//items can focus false to try to get the onItemClick-event
mListView.setItemsCanFocus(false);
mListView.setOnItemClickListener(this);
mListView.setAdapter(this.favoritePointAdapter);

затем в моем методе Adapter.getView () я надуваю свой макет, получаю свой ImageView и регистрирую на нем OnClickListener, как это

@Override 
public View getView(int position, View convertView, ViewGroup parent){
    //....inflate other Views.....
    LinearLayout clickArea = (LinearLayout)convertView.findViewById(R.id.list_row_favorite_point_click_area);
    clickArea.setOnClickListener(this);

   //... other logic follows ...
}

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

@Override
public void onClick(View v) {
    Log.d("ListAdapter", "onClick triggered");
            //never triggered
    switch (v.getId()) {
    case R.id.list_row_favorite_point_click_area:
        Log.d("ListAdapter", "onClick id->list_row_favorite_point_click_area");
        //never triggered
        break;

    default:
        break;
    }
}

Если вы находите XML RowView интересным, вот оно:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/list_row_relative_parent"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal" 
  android:focusable="false">
  <LinearLayout
    android:id="@+id/list_row_icon"
    android:layout_width="30dip"
    android:layout_height="30dip"
    android:layout_gravity="center_vertical"
    android:layout_margin="3dip"
    />
 <LinearLayout
   android:layout_weight="50"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:orientation="vertical"
   android:layout_gravity="center_vertical">   
   <TextView
     android:id="@+id/list_row_name"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:textColor="#333333"
     android:text="defaultText"
     android:textStyle="bold" />         
   <TextView
     android:id="@+id/list_row_region"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:textColor="#999999"
     android:textStyle="italic"
     android:text="Region" />
   </LinearLayout>

   <LinearLayout 
     android:id="@+id/list_row_favorite_point_click_area"
     android:layout_width="50dip"
     android:layout_height="50dip">

   <ImageView
     android:id="@+id/list_row_favorite_icon"
     android:layout_width="20dip"
     android:layout_height="20dip"
     android:layout_gravity="center_vertical"
     android:layout_weight="0.1">
   </ImageView>
   </LinearLayout>
 </LinearLayout>

Как я уже сказал, onItemClick моей активности в ListView срабатывает, когда я никогда не нажимаю onClick внутри моего адаптера. Я думаю, что onItemClick «чувствует» ответственность за всю строку и потребляет TouchEvents. Что я могу сделать, чтобы обойти это?

Примечание. Я попытался установить setItemsCanFocus (false) и настроить фокус в корне на false, как упоминалось в других вопросах.

1 Ответ

0 голосов
/ 12 октября 2011

Вместо использования onClickListener я бы предложил использовать onTouchListener.

Посмотрите этот урок, который я использовал ранее, чтобы получить «скрины экранов» в приложении: http://www.warriorpoint.com/blog/2009/05/29/android-switching-screens-by-dragging-over-the-touch-screen/

Также см. Документацию по android dev на TouchListener: http://developer.android.com/reference/android/view/View.OnTouchListener.html

...