2010-01-20 3 views
43

Возможно ли использовать OnItemClickListener в ListView, когда макет Items имеет интерактивный/редактируемый виджет (RadioButton, EditText или CheckBox)?ListView с интерактивным/редактируемым виджетами

+0

Расширяет ListActivity вместо деятельности. обратитесь к http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/ –

ответ

67

Возможно, вы захотите взглянуть на this issue. Наличие фокусного элемента в строке ListView приводит к тому, что OnItemClickListener НЕ будет вызываться. Тем не менее, это не значит, что вы не можете иметь объекты с возможностью фокусировки/клики в строке, есть некоторые обходные пути, такие как this one.

Кроме того, вы можете посмотреть экран «Журналы вызовов». У этого есть ListView с clickable пунктом (значок вызова справа). See Source code here

+4

Быстрая помощь: «Простой способ обойти эту проблему - позвонить » setDescendantFocusability (FOCUS_BLOCK_DESCENDANTS); » в представлении listView по мере их добавления. Вы сможете выбрать строки, щелкнуть по строкам и нажать на дочерние флажки и кнопки. " - Это цитата из комментария № 27 на странице, на которую ссылаются две ссылки в ответе выше. Спасибо!! –

+1

Ссылка на обходной путь 1 не работает. Может кто-нибудь отредактировать это? – Martze

+0

только первая ссылка работает, остальные сломаны, пожалуйста, исправьте, что – BBdev

20

Цитирование комментарий # 31 в ссылке, упомянутой Samuh (который решал проблему для меня):

На самом деле вы можете добавить его в макет XML (если завышены один): андроид: descendantFocusability = "blocksDescendants".

Добавить здесь JIC, что веб-страница не работает в будущем.

10

Если какой-либо элемент строки списка содержит фокусный или кликабельный вид, то OnItemClickListener не будет работать.

элемент строки должен быть с параметрами, как android:descendantFocusability="blocksDescendants"

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:baselineAligned="false" 
    android:descendantFocusability="blocksDescendants" 
    android:gravity="center_vertical" > 

    // your other widgets here 

</LinearLayout> 
1

перепробовал много комплексных решений, но это было самым простым, что работало:

андроида: фокусируемый = "ложь"

<CheckBox 
    android:id="@+id/fav_check_box" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:focusable="false" /> 
0

Два лучших решения

  1. Добавить android:descendantFocusability="beforeDescendants" в ListView в XML ИЛИ
  2. Набор данного два атрибута false

как

android:focusable="false" 
    android:focusableInTouchMode="false" 

Затем он будет обрабатывать пункт ListView строки ребенка (кнопка, EditText и т. д.) вместо listView.setOnItemClick.

0

Я исправил моя проблема отличается, в моем пункте у меня есть более чем один LinearLayout , так что если вы даете идентификатор к вашему linearayout и setOnclickListener в адаптер класса он будет работать, только оригинальный эффект прикосновения будет ива. но эта ссылка Making a LinearLayout act like an Button является полезным, чтобы сделать linearlaout действие кнопки как на мыши

пункт

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginTop="10dp"> 

    <TextView 
     android:id="@+id/txt_item_followers_name" 
     android:layout_width="250dp" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:gravity="center|start" 
     android:paddingLeft="15dp" 
     android:text="Ali" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <ImageView 
     android:id="@+id/imageView" 
     android:layout_width="35dp" 
     android:layout_height="35dp" 
     android:layout_alignParentStart="true" 
     android:layout_below="@+id/txt_item_followers_name" 
     android:layout_marginLeft="10dp" 
     android:src="@drawable/puan_icon" /> 

    <TextView 
     android:id="@+id/txt_item_followers_mark" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/imageView" 
     android:layout_toEndOf="@+id/imageView" 
     android:background="@color/red_400" 
     android:paddingLeft="10dp" 
     android:text="25.5" 
     android:textAppearance="?android:attr/textAppearanceSmall" /> 

    <LinearLayout 
     android:id="@+id/linear_one" 
     android:layout_width="match_parent" 
     android:layout_height="60dp" 
     android:layout_alignParentTop="true" 
     android:layout_toEndOf="@+id/txt_item_followers_name" 
     android:background="@color/red_400" 
     android:orientation="vertical"> 

     <ImageView 
      android:id="@+id/btn_item_followers_2b_follow" 
      android:layout_width="100dp" 
      android:layout_height="match_parent" 
      android:layout_alignParentEnd="true" 
      android:layout_marginLeft="10dp" 
      android:src="@drawable/follow_buton" /> 
    </LinearLayout> 


</RelativeLayout> 

внутри метода GetView

@Override 
    public View getView(final int position, View convertView, 
         ViewGroup parent) { 
     View view = convertView; 
     if (convertView == null) 
      view = inflater.inflate(R.layout.deneme, null); 

     final Followers2 myObj = myList.get(position); 
     LinearLayout linear_one = (LinearLayout) view.findViewById(R.id.linear_one); // HERE WE DOMUNİCATE IT 
     linear_one.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Toast.makeText(parentActivity, "One Two", Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     TextView name = (TextView) view.findViewById(R.id.txt_item_followers_name); 
     TextView mark = (TextView) view.findViewById(R.id.txt_item_followers_mark); 
     final ImageView btn_follow = (ImageView) view.findViewById(R.id.btn_item_followers_2b_follow); 
     name.setText(myObj.getName()); 
     mark.setText(myObj.getScore()); 
     /* if (myObj.isFollow() == true) { 
      btn_follow.setImageResource(R.drawable.following_buton); 
     } else { 
      btn_follow.setImageResource(R.drawable.follow_buton); 
     } 

     btn_follow.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Followers2 myObj = myList.get(position); 
       if (myObj.isFollow() == true) { 
        btn_follow.setImageResource(R.drawable.following_buton); 
       } else { 
        btn_follow.setImageResource(R.drawable.follow_buton); 
       } 
      } 
     });*/ 

     return view; 
    } 
Смежные вопросы