2010-01-20 6 views
43

Ist es möglich, einen OnItemClickListener in einer ListView zu verwenden, wenn das Items-Layout über ein anklickbares/editierbares Widget (RadioButton, EditText oder CheckBox) verfügt?ListView mit anklickbarem/editierbarem Widget

+0

Verlängert ListActivity statt Aktivität zu machen. Siehe http://www.softwarepassion.com/android-series-custom-listview-items-and-adapter/ –

Antwort

67

Vielleicht möchten Sie einen Blick auf this issue werfen. Wenn Sie ein fokussierbares Element in einer Zeile eines ListView haben, wird OnItemClickListener NICHT aufgerufen. Das bedeutet jedoch nicht, dass Sie keine fokussierbaren/anklickbaren Elemente in einer Zeile haben können. Es gibt einige Problemumgehungen wie this one.

Sie können auch den Bildschirm "Anrufprotokolle" anzeigen. Es hat eine ListView mit anklickbarem Element (das Anrufsymbol auf der rechten Seite). See Source code here

+4

Schnelle Hilfe: "Eine einfache Möglichkeit, dieses Problem zu umgehen, besteht darin, " setDescendantFocusability (FOCUS_BLOCK_DESCENDANTS); " in den Listenansichten, so wie sie hinzugefügt werden Sie können Zeilen auswählen, auf Zeilen klicken und auf untergeordnete Kontrollkästchen und Schaltflächen klicken. " - Dies ist ein Zitat aus Kommentar # 27 auf der Seite, auf die zwei der Links in der obigen Antwort verweisen. Vielen Dank!! –

+1

Link zu Workaround 1 ist unterbrochen. Kann jemand das bearbeiten? – Martze

+0

nur der erste Link funktioniert die anderen sind kaputt bitte behoben, dass – BBdev

20

Zitiert Kommentar # 31 in Verbindung mit Samuh erwähnt (die das Problem für mich gelöst):

In der Tat Sie es in das Layout XML hinzufügen können (falls von einem aufgeblasen): android: demcendantFocusability = "blocksDescendants".

Hier JIC hinzufügen, dass die Webseite in der Zukunft nicht verfügbar ist.

10

Wenn ein Zeilenelement der Liste eine fokussierbare oder anklickbare Ansicht enthält, funktioniert OnItemClickListener nicht.

Reihe Gegenstand muss param wie 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

versucht, viele komplexe Lösungen werden mit, aber es war die einfachste, die funktioniert:

android: fokussierbarem = "false"

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

Zwei beste Lösung

  1. hinzufügen android:descendantFocusability="beforeDescendants" zur Listenansicht in xml ODER
  2. Set gegeben zwei Attribute false

wie

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

Dann wird es das Listview-Reihe Artikel Kind (Button Griff, EditText usw.) Ereignisse anstelle von listView.setOnItemClick.

0

Ich reparierte mein Problem anders, ich habe in meinem Artikel mehr als ein Linearlayout also, wenn Sie ID Ihre linearayout und setOnclickListener in Adapterklasse geben wird, nur ursprüngliche Wirkung der Berührung arbeiten verschwinden. aber dieser Link Making a LinearLayout act like an Button ist nützlich linearlaout wirken wie Taste auf Klick

Artikel

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

innen getView Methode

@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; 
    }