2012-08-05 4 views
21

Ich habe eine erweiterbare Listview. Ich habe einige Dummy-Daten und alles scheint in Ordnung, aber wenn ich die Anwendung ausführen, sind alle Gruppen im Kollaps-Modus und sie werden nicht wirksam, wenn ich auf jeden von ihnen klicke. dies ist der Screenshot: enter image description hereAndroid, Erweiterbare Listenansicht hat keine Reaktion auf Klick !!! Es erweitert sich nicht

XML der Gruppe ist:

<?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="wrap_content" 
    android:background="@color/bg_slider" 
    android:orientation="horizontal" > 


    <TextView 
     android:id="@+id/tvRecipeName" 
     style="@style/normal_text.bold" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_centerVertical="true" 
     android:layout_marginLeft="50dp" 
     android:layout_marginRight="5dp" 
     android:focusable="false" 
     android:lines="1" 
     android:maxLines="1" 
     android:text="@string/dd_title" /> 


    <ImageButton 
     android:id="@+id/ibDeleteRecipe" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_centerVertical="true" 
     android:layout_marginRight="15dp" 
     android:background="@color/transparent" 
     android:contentDescription="@string/cd" 
     android:focusable="false" 
     android:src="@android:drawable/ic_menu_delete" /> 

    <View 
     android:layout_width="1dp" 
     android:layout_height="50dp" 
     android:layout_alignParentLeft="true" 
     android:layout_toLeftOf="@+id/tvRecipeName" 
     android:focusable="false" /> 

</RelativeLayout> 

XML des Kindes ist:

<?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="wrap_content" 
    android:background="@color/White" 
    android:gravity="left|center_vertical" > 

    <View 
     android:layout_width="1dp" 
     android:layout_height="35dp" 
     android:layout_toLeftOf="@+id/tvIngredient" 
     android:focusable="false" /> 

    <TextView 
     android:id="@+id/tvIngredient" 
     style="@style/normal_text_black" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_centerVertical="true" 
     android:layout_marginLeft="30dp" 
     android:layout_marginRight="5dp" 
     android:lines="1" 
     android:maxLines="1" 
     android:text="@string/dd_title" 
     android:focusable="false" /> 

    <ImageButton 
     android:id="@+id/ibDeleteIngredient" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_centerVertical="true" 
     android:layout_marginRight="15dp" 
     android:background="@color/transparent" 
     android:contentDescription="@string/cd" 
     android:focusable="false" 
     android:src="@android:drawable/btn_dialog" /> 

</RelativeLayout> 

und in main.xml, Definition der erweiterbare Liste ist:

<ExpandableListView 
      android:id="@+id/elv" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

Ich habe einen Adapter, den ich diesen Code für das geschrieben habe:

public class ExpAdapter extends BaseExpandableListAdapter { 

    private final String TAG = "ExpAdapter"; 
    private Context context; 
    static final String arrGroupelements[] = {"India", "Australia", "England", "South Africa"}; 
    static final String arrChildelements[][] = { {"Sachin Tendulkar", "Raina", "Dhoni", "Yuvi" }, 
               {"Ponting", "Adam Gilchrist", "Michael Clarke"}, 
               {"Andrew Strauss", "kevin Peterson", "Nasser Hussain"}, 
               {"Graeme Smith", "AB de villiers", "Jacques Kallis"} }; 

    public ExpAdapter(Context context) { 
     this.context = context; 

     Log.i(TAG, "Adapter created."); 
    } 


    @Override 
    public Object getChild(int groupPosition, int childPosition) { 
     return null; 
    } 

    @Override 
    public long getChildId(int groupPosition, int childPosition) { 

     return 0; 
    } 

    @Override 
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 

     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.elv_child, null); 
     } 

     TextView tvItem = (TextView) convertView.findViewById(R.id.tvIngredient); 
     ImageButton ibDelete = (ImageButton) convertView.findViewById(R.id.ibDeleteIngredient); 
     ibDelete.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.i(TAG, "******"); 
      } 
     }); 
     tvItem.setText(arrChildelements[groupPosition][childPosition]); 

     return convertView; 
    } 

    @Override 
    public int getChildrenCount(int groupPosition) { 
     return arrChildelements[groupPosition].length; 
    } 

    @Override 
    public Object getGroup(int groupPosition) { 
     return null; 
    } 

    @Override 
    public int getGroupCount() { 
     return arrGroupelements.length; 
    } 

    @Override 
    public long getGroupId(int groupPosition) { 
     return 0; 
    } 

    @Override 
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { 

     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.elv_group, null); 
     } 

     TextView tvItem = (TextView) convertView.findViewById(R.id.tvRecipeName); 
     ImageButton ibDeleteRcipe = (ImageButton) convertView.findViewById(R.id.ibDeleteRecipe); 
     ibDeleteRcipe.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.i(TAG, "%%%%%%"); 
      } 
     }); 
     tvItem.setText(arrGroupelements[groupPosition]); 

     return convertView; 
    } 

    @Override 
    public boolean hasStableIds() { 
     return false; 
    } 

    @Override 
    public boolean isChildSelectable(int groupPosition, int childPosition) { 
     return true; 
    } 

} 

und schließlich Aktivität in Code-Fragment ich habe:

public class ShoppingList extends FragmentActivity {  
     ExpAdapter adapter = new ExpAdapter(this); 
     //Linking expnadable list view 
     expListView = (ExpandableListView) findViewById(R.id.elv); 
     expListView.setAdapter(adapter); 
     expListView.setOnGroupExpandListener(new OnGroupExpandListener() { 
      @Override 
      public void onGroupExpand(int groupPosition) { 
       Log.i(TAG, "Group " + groupPosition + " expanded."); 
      } 
     }); 
     expListView.setOnGroupCollapseListener(new OnGroupCollapseListener() { 
      @Override 
      public void onGroupCollapse(int groupPosition) { 
       Log.i(TAG, "Group " + groupPosition + " collapsed."); 
      } 
     }); 
     expListView.setOnChildClickListener(new OnChildClickListener() { 
      @Override 
      public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { 
       Log.i(TAG, "item " + childPosition + " of group " + groupPosition + " clicked."); 
       return false; 
      } 
     }); 

} 

Wenn ich die Anwendung ausführen, und klicken Sie om Eltern nichts passiert. Ich habe versucht, am Ende der Einkaufs Klasse folgenden Codezeilen hinzu:

int count = adapter.getGroupCount(); 
for (int position = 1; position <= count; position++) 
    expListView.expandGroup(position - 1); 

Nun, wenn ich die Anwendung Ergebnis führen wie dieser Screenshot ist: enter image description here

, wenn ich auf Löschtasten (Elternteil oder Kind), Kann ich sehen, dass sie wirksam werden (wie ich logcat überprüfe), aber wenn ich auf Kind oder Elternteil klicke, passiert nichts. Also, ich habe keine Ahnung, warum Callbacks nicht funktionieren. Basierend auf meinen Recherchen habe ich festgestellt, dass ich Focussable von Bildschaltflächen auf false setzen muss. Wie Sie in XML-Dateien sehen können, habe ich es gemacht, aber immer noch, wenn ich auf Eltern- und Kind-Zeilen klicke, kann ich keine Antwort sehen.

Da ich über 6-7 Stunden verbrachte, um eine Lösung zu finden und war nicht erfolgreich, ich freue mich für Ihre Kommentare und Anregungen. Dank

Antwort

31

Schließlich fand ich die Lösung :)

Ich habe keine Ahnung, ist es Fehler oder Krankheit oder ...

Wie oben auf der Grundlage meiner Forschung erwähnt fand ich, dass wir Fokus-Fähigkeit setzen müssen der Bildansicht/Box auf "false". Ich habe es in XML-Datei getan und es hat nicht funktioniert. Ich setze die Fokusfähigkeit in XML auf "wahr" und setze sie im Code auf "falsch". wie folgt:

@Override 
    public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { 

     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.elv_group, null); 
     } 

     TextView tvItem = (TextView) convertView.findViewById(R.id.tvRecipeName); 
     ImageButton ibDeleteRcipe = (ImageButton) convertView.findViewById(R.id.ibDeleteRecipe); 
     ibDeleteRcipe.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) {    
       ... 
      } 
     }); 
     ibDeleteRcipe.setFocusable(false); 

     tvItem.setText(arrGroupElements[groupPosition]); 

     return convertView; 
    } 

Daher basiert auf meiner Leistung! Es sollte im Code und nicht in XML auf "falsch" gesetzt werden! Jetzt ist die Frage Was ist der Unterschied? -Ich habe keine Ahnung.

+0

Es funktioniert.Es ist jedoch nicht notwendig, ein fokussierbares Attribut in der Layout-XML-Datei zu definieren. – emaringolo

+0

Hinweis: wir müssen android setzen: focusable = "false" in

+0

Nach Stunden des Debuggens, als ich den Fokus durch Code auf "Falsch" setzen konnte, begann mein onlinklick auf die erweiterbare Listenansicht zu feuern. Das ist sehr seltsam. Jeder weiß warum? –

3

Es ist erforderlich, android:focusable="false" im Layout-XML für fokussierbare Ansichten innerhalb des Elements der erweiterbaren Listenansicht zu definieren, nicht jedoch im Attribut "ExpandableListView".

Beispiel: Wenn ein benutzerdefiniertes Elternlistenelement ein Kontrollkästchen enthält (es wird automatisch den Fokus erhalten), sollte es wie folgt aussehen.

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