2012-08-19 10 views
5

Soy principiante para la programación de Android. He descargado el código desde http://shenhengbin.wordpress.com y funciona bien, pero el único problema es que no activa el en ClickClick.Android expandiblelistview no se activa enChildClick

Aquí es la principal actividad

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

Aquí es el BaseExpandableListAdapter personalizada

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

diseño de elemento de grupo

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

y aquí está el diseño elemento secundario

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

por favor ayúdame

+0

No veo en ningún lugar de su código donde establezca el oyente para clics secundarios para realmente escuchar esos eventos. – Luksprog

+0

cuando agrego mExpandableListView.setOnChildClickListener (nueva onChildClickListener() { \t \t \t pública booleano onChildClick (ExpandableListView padres, Ver v, int groupPosition, int childPosition, siempre id) { \t \t String cadena = "Niño click"; \t \t \t int duración = Toast.LENGTH_SHORT; \t \t \t tostada tostada = Toast.makeText (getApplicationContext(), secuencia, duración); \t \t tostadas.espectáculo(); \t \t return false; \t \t} \t \t}); onCreate() me muestra el error en eclipse ya que onChildClickListener no se puede resolver con un tipo – Manu

+0

@Manu. También he usado el mismo tutorial. Por favor dígame cómo realizar la acción en el clic del niño. – mukesh

Respuesta

0

Para configurar el oyente para el niño hace clic usted puede hacerlo de esta manera en el initPage método (no 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

Disculpa, dame el mismo error – Manu

+0

@Manu ¿Y qué te dice el error? ¿Está seguro de tener las importaciones correctas: 'import android.widget.ExpandableListView;' y 'import android.widget.ExpandableListView.OnChildClickListener;'? – Luksprog

+0

Sí, lo he importado. Pero me da error como: El método setOnChildClickListener (ExpandableListView.OnChildClickListener) en el ExpandableListView tipo no es aplicable para los \t argumentos (nueva OnChildClickListener() {}) \t - OnChildClickListener no se puede resolver a un tipo – Manu

13

En adaptador que tiene un método llamado isChildSelectable () La bruja devuelve falso, ese es el problema. Cambie el valor devuelto a verdadero para resolver el problema.

+1

Esto debería haberse hecho como la respuesta correcta hace mucho tiempo ... está dejando que este método heredado Pasar desapercibido que me hizo arrancar todos mis pelos: P – LeoFarage

+0

Sería útil si eligió una respuesta correcta, por lo que también podría ayudar a otros o compartir la solución que finalmente funcionó para usted. –

1

Sé que es un hilo antiguo, pero si alguien viene aquí para encontrar una respuesta, esto es para ellos. Encontré el mismo problema cuando utilicé this tutorial for expandable list view para hacer un elemento secundario clicable, simplemente vaya al "diseño de elementos del grupo principal" (en mi código es list_group_item) y haga que la distribución lineal y la vista de texto sean seleccionables y falsificables.

4

Estaba enfrentando este problema, en ClickClick no se activaba.

me encontré con este comentario:

solucionado, el problema es que si usted tiene varios de TextView en la childview, la propiedad enfocable debe ser falsa (no sé exactamente por qué) añadir androide: descendantFocusability = "blocksDescendants" a la vista resuelven el problema

en Android ExpandableListView and onChildClick not working

por lo que añadir android:descendantFocusability="blocksDescendants" en childView trabajó para mí.

+2

Esta fue la única solución que funcionó para mí. Otras sugerencias comunes, como configurar isChildSelectable() para devolver verdadero, fueron necesarias pero no suficientes para resolver el problema. –

+0

Genius !!! Esta fue la solución para mí – Merlevede

Cuestiones relacionadas