2010-01-20 15 views
43

È possibile utilizzare un OnItemClickListener su un controllo ListView quando il layout Articoli dispone di un widget selezionabile/modificabile (RadioButton, EditText o CheckBox)?ListView con widget cliccabile/modificabile

+0

Estende ListActivity invece di attività. consultare http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/ –

risposta

67

Si potrebbe dare un'occhiata a this issue. Avere un oggetto focalizzabile in una riga di un ListView causa l'invocazione di OnItemClickListener. Tuttavia, ciò non significa che non è possibile avere elementi attivabili/selezionabili in una riga, esistono soluzioni alternative come this one.

Inoltre, è possibile dare un'occhiata alla schermata Registro chiamate. Ha un ListView con elemento cliccabile (l'icona della chiamata sulla destra). See Source code here

+4

Aiuto rapido: "Un modo semplice per ovviare a questo problema è chiamare " setDescendantFocusability (FOCUS_BLOCK_DESCENDANTS); " nelle viste listView così come sono aggiunti Sarai in grado di selezionare le righe, fare clic su righe e fare clic su caselle e pulsanti secondari. " - Questa è una citazione dal commento # 27 nella pagina a cui fanno riferimento due dei link nella risposta sopra. Grazie mille!! –

+1

Il collegamento al workaround 1 è rotto. Qualcuno può modificare questo? – Martze

+0

solo il primo link sta funzionando gli altri sono guasti, per favore risolto quello – BBdev

20

Citando commento # 31 nel collegamento di cui parla Samuh (che ha risolto il problema per me):

In realtà è possibile aggiungere al XML di layout (se gonfiato da uno): android: descendantFocusability = "blocksDescendants".

Aggiunta qui JIC che la pagina Web non è disponibile in futuro.

10

Se una riga di un elemento dell'elenco contiene una vista selezionabile o selezionabile, allora OnItemClickListener non funzionerà.

elemento riga deve essere avere param come 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

provato molte soluzioni complesse, ma era il più semplice che funzionava:

android: focalizzabile = "false"

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

Due migliori soluzioni

  1. Aggiungi android:descendantFocusability="beforeDescendants" a listView in xml O
  2. Set dato due attributi per false

come

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

Poi si gestirà il bambino oggetto fila listView (Button, EditText ecc.) invece di listView.setOnItemClick.

0

ho fissato il mio problema diverso, nel mio articolo ho più di una LinearLayout quindi se si dà id al vostro linearayout e setOnclickListener in classe adattatore funzionerà, unico effetto originale di toccare scompariranno. ma questo link Making a LinearLayout act like an Button è utile per fare linearlaout agire pulsante mi piace al clic

voce

<?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> 

all'interno metodo 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; 
    }