2012-08-19 11 views
5

Sono principiante per la programmazione Android. Ho scaricato il codice da http://shenhengbin.wordpress.com e funziona bene, ma l'unico problema è non attivare il onChildClick.Personalizzato Android Expandablelistview non si attiva suChildClick

Qui è l'attività principale

public class MenuCategory extends Activity { 
     private ExpandableListView mExpandableListView; 
     private List<GroupEntity> mGroupCollection; 
     ExpandableListAdapter adapter; 

     @Override 
     public void onCreate(Bundle savedInstanceStater) { 

      super.onCreate(savedInstanceState); 
      setContentView(R.layout.menucategory); 

      prepareResource(); 
      initPage(); 

     } 


     private void prepareResource() { 
      String data = null; 
      FileInputStream fIn = null; 
      InputStreamReader isr = null; 
      String response = null; 
      String getParam = "?get=menuCategory"; 
      try{ 
       fIn = openFileInput("fromfile.dat"); 
       isr = new InputStreamReader(fIn); 
       int size = fIn.available(); 
       char[] inputBuffer = new char[size]; 
       isr.read(inputBuffer); 
       data = new String(inputBuffer); 
       isr.close(); 
       fIn.close(); 
       String[] dataSep = data.split("#"); 
       String Hs = dataSep[0]; 

       try { 
        response = CustomHttpClient.executeHttpGet(Hs+getParam); 
        String res = response.toString(); 
        if(response.length()!=0){ 
         mGroupCollection = new ArrayList<GroupEntity>(); 
         JSONObject jsonObject = null; 
         JSONArray eventArray = new JSONArray(res); 
         for (int i = 0; i < eventArray.length(); i++) { 
          jsonObject = eventArray.getJSONObject(i); 
          GroupEntity ge = new GroupEntity(); 
          ge.Name = jsonObject.getString("Cat"); 

          JSONArray abc = jsonObject.getJSONArray("SubCat"); 
          for (int j=0; j<abc.length(); j++){ 
           GroupItemEntity gi = ge.new GroupItemEntity(); 
           gi.Name = abc.getString(j); 
           ge.GroupItemCollection.add(gi); 
          } 
          mGroupCollection.add(ge); 
         } 
        } 
       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 


      }catch(IOException e){ 
       e.printStackTrace(System.err); 
      } 
     } 

     private void initPage() { 
      mExpandableListView = (ExpandableListView) findViewById(R.id.expandableListView); 
      adapter = new ExpandableListAdapter(this,mExpandableListView, mGroupCollection); 
      mExpandableListView.setAdapter(adapter); 
      registerForContextMenu(mExpandableListView); 
     } 
     public boolean onChildClick(ExpandableListView parent, View v, int groupPosition,int childPosition,long id) { 
      String string = "Child Click"; 
      int duration = Toast.LENGTH_SHORT; 
      Toast toast = Toast.makeText(getApplicationContext(), string, duration); 
      toast.show(); 
      return false; 
     } 
    } 

Ecco la BaseExpandableListAdapter personalizzato

public class ExpandableListAdapter extends BaseExpandableListAdapter { 

    private Context mContext; 
    private ExpandableListView mExpandableListView; 
    private List<GroupEntity> mGroupCollection; 
    private int[] groupStatus; 
    private int lastExpandedGroupPosition; 

    public ExpandableListAdapter(Context pContext, 
      ExpandableListView pExpandableListView, 
      List<GroupEntity> pGroupCollection) { 
     mContext = pContext; 
     mGroupCollection = pGroupCollection; 
     mExpandableListView = pExpandableListView; 
     groupStatus = new int[mGroupCollection.size()]; 

     setListEvent(); 
    } 

    private void setListEvent() { 

     mExpandableListView 
       .setOnGroupExpandListener(new OnGroupExpandListener() { 

        public void onGroupExpand(int arg0) { 
         // TODO Auto-generated method stub 
         groupStatus[arg0] = 1; 
         lastExpandedGroupPosition = arg0; 
        } 
       }); 

     mExpandableListView 
       .setOnGroupCollapseListener(new OnGroupCollapseListener() { 

        public void onGroupCollapse(int arg0) { 
         // TODO Auto-generated method stub 
         groupStatus[arg0] = 0; 
        } 
       }); 
    } 

    public String getChild(int arg0, int arg1) { 
     // TODO Auto-generated method stub 
     return mGroupCollection.get(arg0).GroupItemCollection.get(arg1).Name; 
    } 

    public long getChildId(int arg0, int arg1) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    public View getChildView(int arg0, int arg1, boolean arg2, View arg3, 
      ViewGroup arg4) { 
     // TODO Auto-generated method stub 

     ChildHolder childHolder; 
     if (arg3 == null) { 
      arg3 = LayoutInflater.from(mContext).inflate(
        R.layout.list_group_item, null); 

      childHolder = new ChildHolder(); 

      childHolder.title = (TextView) arg3.findViewById(R.id.item_title); 
      arg3.setTag(childHolder); 
     }else { 
      childHolder = (ChildHolder) arg3.getTag(); 
     } 

     childHolder.title.setText(mGroupCollection.get(arg0).GroupItemCollection.get(arg1).Name); 
     return arg3; 
    } 

    public int getChildrenCount(int arg0) { 
     // TODO Auto-generated method stub 
     return mGroupCollection.get(arg0).GroupItemCollection.size(); 
    } 

    public Object getGroup(int arg0) { 
     // TODO Auto-generated method stub 
     return mGroupCollection.get(arg0); 
    } 

    public int getGroupCount() { 
     // TODO Auto-generated method stub 
     return mGroupCollection.size(); 
    } 

    public long getGroupId(int arg0) { 
     // TODO Auto-generated method stub 
     return arg0; 
    } 

    public View getGroupView(int arg0, boolean arg1, View arg2, ViewGroup arg3) { 
     // TODO Auto-generated method stub 
     GroupHolder groupHolder; 
     if (arg2 == null) { 
      arg2 = LayoutInflater.from(mContext).inflate(R.layout.list_group, 
        null); 
      groupHolder = new GroupHolder(); 
      groupHolder.img = (ImageView) arg2.findViewById(R.id.tag_img); 
      groupHolder.title = (TextView) arg2.findViewById(R.id.group_title); 
      arg2.setTag(groupHolder); 
     } else { 
      groupHolder = (GroupHolder) arg2.getTag(); 
     } 
     if (groupStatus[arg0] == 0) { 
      groupHolder.img.setImageResource(R.drawable.group_down); 
     } else { 
      groupHolder.img.setImageResource(R.drawable.group_up); 
     } 
     groupHolder.title.setText(mGroupCollection.get(arg0).Name); 

     return arg2; 
    } 

    class GroupHolder { 
     ImageView img; 
     TextView title; 
    } 

    class ChildHolder { 
     TextView title; 
    } 

    public boolean hasStableIds() { 
     // TODO Auto-generated method stub 
     return true; 
    } 

    public boolean isChildSelectable(int arg0, int arg1) { 
     // TODO Auto-generated method stub 
     return true; 
    } 

    @Override 
    public void onGroupExpanded(int groupPosition){ 
     //collapse the old expanded group, if not the same 
     //as new group to expand 
     if(groupPosition != lastExpandedGroupPosition){ 
      mExpandableListView.collapseGroup(lastExpandedGroupPosition); 
     } 

     super.onGroupExpanded(groupPosition);   
     lastExpandedGroupPosition = groupPosition; 
    } 
} 

il layout dell'oggetto Gruppo

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="@drawable/group_header_bg" 
    android:gravity="center_vertical" > 

    <ImageView 
     android:id="@+id/tag_img" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginRight="10dip" 
     android:src="@drawable/group_down" 
     android:focusable="false" 
     /> 

    <TextView 
     android:id="@+id/group_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_centerVertical="true" 
     android:layout_marginLeft="10dip" 
     android:text="" 
     android:textColor="#57810f" 
     android:textSize="18dip" 
     android:textStyle="bold" 
     android:focusable="false" 
     /> 

</RelativeLayout> 

e qui è il layout elemento figlio

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:baselineAligned="false" 
    android:paddingTop="5dip" > 

    <LinearLayout 
     android:id="@+id/groupItem" 
     android:layout_width="0dip" 
     android:layout_height="fill_parent" 
     android:layout_weight="1" 
     android:background="@drawable/play_group_item" 
     android:clickable="true" > 


     <TextView 
      android:id="@+id/item_title" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginBottom="15dip" 
      android:layout_marginLeft="15dip" 
      android:text="sample" 
      android:textColor="#FFF38585" 
      android:textSize="20sp" 
      android:focusable="false" 
      /> 

    </LinearLayout> 

</LinearLayout> 

aiutarmi

+0

Non vedo da nessuna parte nel codice in cui si imposta il listener per i clic secondari per l'ascolto effettivo di quegli eventi. – Luksprog

+0

quando aggiungo mExpandableListView.setOnChildClickListener (nuova onChildClickListener() { \t \t \t public boolean onChildClick (ExpandableListView genitore, Vista v, int groupPosition, int childPosition, lungo id) { \t \t stringa String = "Bambino Click"; \t \t \t int durata = Toast.LENGTH_SHORT; \t \t \t Toast brindisi = Toast.makeText (getApplicationContext(), string, durata); \t \t pane tostato.mostrare(); \t \t return false; \t \t} \t \t}); onCreate() mi mostra l'errore su eclipse dato che onChildClickListener non può essere risolto con un tipo – Manu

+0

@Manu Ho anche utilizzato lo stesso tutorial. Per favore dimmi come eseguire un'azione sul click bambino. – mukesh

risposta

0

Per impostare l'ascoltatore per il bambino clic si può fare in questo modo nel metodo initPage (non onCreate()):

mExpandableListView = (ExpandableListView) findViewById(R.id.expandableListView); 
      adapter = new ExpandableListAdapter(this,mExpandableListView, mGroupCollection); 
      mExpandableListView.setAdapter(adapter); 
registerForContextMenu(mExpandableListView); 
mExpandableListView.setOnChildClickListener(new OnChildClickListener() { 

      @Override 
      public boolean onChildClick(ExpandableListView parent, View v, 
        int groupPosition, int childPosition, long id) { 
       String string = "Child Click"; 
       int duration = Toast.LENGTH_SHORT; 
       Toast toast = Toast.makeText(getApplicationContext(), string, 
         duration); 
       toast.show(); 
       return false; 
      } 
     }); 
+0

Mi dispiace, dammi lo stesso errore – Manu

+0

@ Maanu E cosa ti dice l'errore? Sei sicuro di avere le importazioni corrette: 'importa android.widget.ExpandableListView;' e 'importa android.widget.ExpandableListView.OnChildClickListener;'? – Luksprog

+0

Sì, ho importato. Ma mi dà errore: Il metodo setOnChildClickListener (ExpandableListView.OnChildClickListener) nel tipo ExpandableListView non è applicabile per le \t argomenti (nuova OnChildClickListener() {}) \t - OnChildClickListener non può essere risolto in un tipo – Manu

13

adattatore si dispone di un metodo chiamato isChildSelectable () strega restituisce falso, questo è il problema. Modificare il valore restituito su true per risolvere il problema.

+1

Questo dovrebbe essere stato fatto come risposta giusta molto tempo fa .. sta lasciando che questo metodo ereditato passare inosservato che mi ha fatto strappare tutti i miei capelli: P – LeoFarage

+0

Sarebbe utile se hai scelto una risposta giusta, quindi potrebbe anche aiutare gli altri o condividere la soluzione che ha finalmente funzionato per voi. –

1

So che è vecchio thread, ma se qualcuno viene qui per trovare la risposta, questo è per loro. Ho riscontrato lo stesso problema quando ho usato this tutorial for expandable list view per rendere elemento figlio cliccabile semplicemente andare a "layout di gruppo principale" (nel mio codice è list_group_item) e rendere linearlayout e textview cliccabili e facusable false.

4

Mi trovavo di fronte a questo problema, onChildClick non veniva attivato.

Ho trovato questo commento:

risolto, il problema è che se si dispone di diversi TextView del sul childview, la proprietà attivabile deve essere falsa (non so esattamente il motivo) l'aggiunta di Android: descendantFocusability = "blocksDescendants" alla vista risolto il problema

su Android ExpandableListView and onChildClick not working

Quindi, aggiungendo android:descendantFocusability="blocksDescendants" su childView ha lavorato per me.

+2

Questa era l'unica soluzione che ha funzionato per me. Altri suggerimenti comuni, come impostare isChildSelectable() per restituire true, erano necessari ma non sufficienti per risolvere il problema. –

+0

Genius !!! Questa era la soluzione per me – Merlevede

Problemi correlati