9

No puedo entender por qué mi ExpandableListView no se expande ... He utilizado declaraciones de registro en casi todos los detectores de clics que puedo encontrar para ExpandableListView y no parece que ninguno de ellos sea llamado.android expandiblelistview no expande ni recibe eventos de clics

Sé que hay muchas publicaciones sobre este tema, pero las he leído todas y he intentado muchas cosas y no estoy teniendo suerte, con suerte me falta un pequeño error que será fácil de detectar para otra persona.

Actividad principal:

public class ForumListActivity extends Activity { 

    private static ArrayList<Forum> forumList; 
    private static ArrayList<ArrayList<SubForum>> subForumList; 
    private ExpandableListView forumListView; 
    private ForumListAdapter forumListAdapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.setContentView(R.layout.main_page); 
     this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); 

     forumListView = (ExpandableListView) this.findViewById(R.id.main_page_forum_list); 

     forumList = new ArrayList<Forum>(); 
     subForumList = new ArrayList<ArrayList<SubForum>>(); 
     setUpForums(this); 

     forumListAdapter = new ForumListAdapter(this, forumList, subForumList); 
     forumListView.setAdapter(forumListAdapter); 

     forumListView.setOnGroupExpandListener(new OnGroupExpandListener(){ 
      @Override 
      public void onGroupExpand(int groupPosition) { 
       Log.d("onGroupExpand", "this works?"); 
       for(int i=0; i<forumListAdapter.getGroupCount(); i++) { 
        if(i != groupPosition) 
         forumListView.collapseGroup(groupPosition); 
       } 
      } 
     }); 

     forumListView.setOnGroupClickListener(new OnGroupClickListener() { 
      @Override 
      public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { 
       Log.d("onGroupClick:", "worked"); 
       parent.expandGroup(groupPosition); 
       return true; 
      } 
     }); 
    } 

Nota: los setUpForums método() sólo toma matrices del sistema y las pone en forumList y subForumList

ListViewAdapter:

public class ForumListAdapter extends BaseExpandableListAdapter { 

    private ArrayList<Forum> groups; 
    private ArrayList<ArrayList<SubForum>> children; 
    private Context ctx; 

    public ForumListAdapter(Context ctx, ArrayList<Forum> groups, ArrayList<ArrayList<SubForum>> children) { 
     this.ctx = ctx; 
     this.groups = groups; 
     this.children = children; 
    } 



    @Override 
    public Object getChild(int groupPosition, int childPosition) { 
     return children.get(groupPosition).get(childPosition); 
    } 



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



    @Override 
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      LayoutInflater inflater = LayoutInflater.from(ctx); 
      convertView = inflater.inflate(R.layout.forum_list_child_item_row, null); 
     } 

     SubForum currentSubForum = children.get(groupPosition).get(childPosition); 
     TextView name = (TextView)convertView.findViewById(R.id.child_row_forum_title); 
     TextView desc = (TextView)convertView.findViewById(R.id.child_row_forum_description); 

     if (name != null) 
      name.setText(currentSubForum.getName()); 

     if (desc != null) 
      desc.setText(currentSubForum.getDescription()); 

     convertView.setFocusableInTouchMode(true); 
     return convertView; 
    } 



    @Override 
    public int getChildrenCount(int groupPosition) { 
     return children.get(groupPosition).size(); 
    } 



    @Override 
    public Object getGroup(int groupPosition) { 
     return groups.get(groupPosition); 
    } 



    @Override 
    public int getGroupCount() { 
     return groups.size(); 
    } 



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



    @Override 
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { 
     if (convertView == null) 
     { 
      LayoutInflater inflater = LayoutInflater.from(ctx); 
      convertView = inflater.inflate(R.layout.forum_list_group_item_row, null); 
     } 

     Forum currentForum = (Forum) groups.get(groupPosition); 
     TextView name = (TextView) convertView.findViewById(R.id.group_item_forum_title); 
     //ImageView image = (ImageView) convertView.findViewById(R.id.group_item_expander_image); 

     if(name != null) 
      name.setText(currentForum.getName());   

     /* 
     if(image != null) { 
      int[][] group_state_sets = {{}, {android.R.attr.state_expanded}}; 
      image.setVisibility(View.VISIBLE); 
      int stateSetIndex = (isExpanded ? 1 : 0) ; 
      Drawable drawable = image.getDrawable(); 
      drawable.setState(group_state_sets[stateSetIndex]); 
     } 
     */ 

     return convertView; 
    } 



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



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


} 

grupo Diseño:

<?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:background="@drawable/turquoise_gradient" 
    android:orientation="horizontal" 
    android:paddingTop="6dip" 
    android:paddingBottom="6dip" 
    android:paddingLeft="6dip" > 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:background="@drawable/turquoise_gradient" 
     android:orientation="vertical" 
     android:padding="2dip" > 

     <TextView 
      android:id="@+id/group_item_forum_title" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_vertical|left" 
      android:gravity="left" 
      android:paddingLeft="5dip" 
      android:textColor="@color/white" 
      android:textSize="16dip" /> 

    </LinearLayout> 

    <!-- 
    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical" 
     android:gravity="center|right"> 

     <ImageView 
      android:id="@+id/group_item_expander_image" 
      android:focusable="false" 
      android:focusableInTouchMode="false" 
      android:gravity="center" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:src="@drawable/collapse_down" /> 


    </LinearLayout> --> 

</LinearLayout> 
Disposición

niño:

<?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:background="@drawable/turquoise_gradient" 
    android:orientation="horizontal" 
    android:paddingTop="6dip" 
    android:paddingBottom="6dip" 
    android:paddingLeft="6dip" > 


    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" 
     android:padding="2dip" 
     android:background="@drawable/turquoise_gradient" > 

     <TextView 
      android:id="@+id/child_row_forum_title" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:gravity="left" 
      android:layout_gravity="center_vertical" 
      android:paddingLeft="5dip" 
      android:textColor="@color/white" 
      android:maxLines="1" 
      android:textSize="11dip" /> 

     <TextView 
      android:id="@+id/child_row_forum_description" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:gravity="left" 
      android:layout_gravity="center_vertical" 
      android:paddingLeft="15dip" 
      android:textColor="@color/white" 
      android:maxLines="2" 
      android:textSize="11dip" /> 

    </LinearLayout> 

</LinearLayout> 

diseño de la página principal:

<?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:background="@color/black" 
    android:orientation="vertical" > 

    <ExpandableListView 
     android:id="@+id/main_page_forum_list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:background="@color/black" 
     android:divider="@color/black" 
     android:dividerHeight="1dip" 
     android:clickable="true" /> 

</LinearLayout> 

Cualquier ayuda que puede proporcionar es muy apreciada!

+0

su puede ser porque usted no tiene datos niño allí, tienen u depurado – Rakshi

+0

intento agregando un valor de texto predeterminado en el diseño de su hijo para textviews – Rakshi

Respuesta

21

tengo también se encontró con un problema similar al tuyo. Después de un par de días de investigación, descubrí que había hecho algo mal. Así que lo arreglé para que funcione correctamente haciendo pequeños cambios.

Veamos el cuerpo de boolean onGroupClick(...) en setOnGroupClickListener.Has vuelto cierto que significa "the click was handled"

Debe return false si desea ampliar. Así que sugiero que lo haga de esta manera:

forumListView.setOnGroupClickListener(new OnGroupClickListener() { 
    @Override 
    public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { 
      Log.d("onGroupClick:", "worked"); 
      parent.expandGroup(groupPosition); 
      return false; 
     } 
    }); 

en android.widget.ExpandableListView clase, hay un método llamado boolean handleItemClick(View v, int position, long id) que es responsable de expandir/colapsar grupos o transmitir el clic con el niño apropiado.

/* It's a group click, so pass on event */ 
     if (mOnGroupClickListener != null) { 
      if (mOnGroupClickListener.onGroupClick(this, v, 
        posMetadata.position.groupPos, id)) { 
       posMetadata.recycle(); 
       return true; 
      } 
     } 

    /* expanding/collapsing/other tasks... */ 

si implementa onGroupClick-retorno verdadera, no se ejecutará el código de abajo de la octava línea. (eso significa que los grupos nunca se colapsarán, se expandirán)

Espero que mi respuesta te haya ayudado :-) ¡buena suerte!

+0

Acabas de ahorrar 3 días de dolores de cabeza. Gracias y +1 por una excelente respuesta –

+0

¡gracias por esto! –

6

Probablemente hay tres cosas u necesidad de comprobar,

  1. comprobar si tiene alguna u datos disponibles para el chid, porque si u no tiene ningún dato que el niño no aparece en absoluto.

2.Try eliminación si comprobación del estado, mientras que utilizando inflado de diseño

if (convertView == null) { 
    LayoutInflater inflater = LayoutInflater.from(ctx); 
    convertView = inflater.inflate(R.layout.forum_list_child_item_row, null); 
    } 
  1. que necesita para pasar también aquí Viewgroup

    convertView = inflater.inflate(R.layout.forum_list_child_item_row,parent, false); 
    
+0

Los datos malos fueron mi problema, ¡¡Gracias de nuevo !! –

0

Añade implements OnGroupExpandListener a tu actividad. Entonces Funcionará. Estoy usando lo mismo, funciona bien.

0

Cuando trabaje con listas ampliables, la expansión de grupo es la funcionalidad predeterminada. significa que el grupo se expandirá en sí sólo cuando se hace clic en él se donot necesita overrirde onGroupExpand (int groupPosition) o cualquier otro método simplemente llenar sus datos en su lista de algo como esto:

public class MyActivity extends Activity { 

    private ExpandableListView forumListView; 
    private ForumListAdapter forumListAdapter; 
    String[] forumList={"group 1","group 2","group 3"}; 
String[][] subForumList={{"group 1 child1","group 1 child1","group 1 child3"}, 
        {"group 2 child1","group 2 child2","group 2 child3"}, 
        {"group 3 child1","group 3 child2","group 3 child3"}, 
        }; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
this.setContentView(R.layout.main); 


forumListView = (ExpandableListView) this.findViewById(R.id.main_page_forum_list); 




forumListAdapter = new ForumListAdapter(this, forumList, subForumList); 
forumListView.setAdapter(forumListAdapter); 



    /* forumListView.setOnGroupExpandListener(new OnGroupExpandListener(){ 
    public void onGroupExpand(int groupPosition) { 
     Log.d("onGroupExpand", "this shit works?"); 
     for(int i=0; i<forumListAdapter.getGroupCount(); i++) { 
      if(i != groupPosition) 
       forumListView.collapseGroup(groupPosition); 
     } 
    } 
}); 

forumListView.setOnGroupClickListener(new OnGroupClickListener() { 
    public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) { 
     Log.d("onGroupClick:", "worked"); 
     parent.expandGroup(groupPosition); 
     return true; 
    } 
});*/ 
    } 

    public class ForumListAdapter extends BaseExpandableListAdapter { 

     String[] groups; 
    String[][] children; 
    private Context ctx; 

    public ForumListAdapter(Context ctx, String[] groups, String[][] children) { 
    this.ctx = ctx; 
    this.groups = groups; 
    this.children = children; 
} 

public Object getChild(int arg0, int arg1) { 
    // TODO Auto-generated method stub 
    return children[arg0][arg1]; 
} 

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

public View getChildView(int arg0, int arg1, boolean arg2, View arg3, 
     ViewGroup arg4) { 
    if (arg3 == null) { 
     LayoutInflater inflater = LayoutInflater.from(ctx); 
     arg3 = inflater.inflate(R.layout.child, null); 
    } 

    String childData = children[arg0][arg1]; 
    TextView name = (TextView)arg3.findViewById(R.id.child_row_forum_title); 
    TextView desc = (TextView)arg3.findViewById(R.id.child_row_forum_description); 

    if (name != null) 
     name.setText(childData); 

    if (desc != null) 
     // desc.setText(currentSubForum.getDescription()); 

    arg3.setFocusableInTouchMode(true); 
    return arg3;} 

public int getChildrenCount(int arg0) { 
    // TODO Auto-generated method stub 
    return children[arg0].length; 
} 

public Object getGroup(int arg0) { 
    // TODO Auto-generated method stub 
    return groups[arg0]; 
} 

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

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

public View getGroupView(int arg0, boolean arg1, View arg2, ViewGroup arg3) { 
    if (arg2 == null) 
    { 
     LayoutInflater inflater = LayoutInflater.from(ctx); 
     arg2 = inflater.inflate(R.layout.group, null); 
    } 


    TextView name = (TextView) arg2.findViewById(R.id.group_item_forum_title); 
    //ImageView image = (ImageView) arg2.findViewById(R.id.group_item_expander_image); 

    if(name != null) 
     name.setText(groups[arg0]);   

    /* 
    if(image != null) { 
     int[][] group_state_sets = {{}, {android.R.attr.state_expanded}}; 
     image.setVisibility(View.VISIBLE); 
     int stateSetIndex = (isExpanded ? 1 : 0) ; 
     Drawable drawable = image.getDrawable(); 
     drawable.setState(group_state_sets[stateSetIndex]); 
    } 
    */ 

    return arg2;} 

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

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

     } 
3

Asegúrate de que tu diseño de grupo personalizado no tenga android:textIsSelectable="false" como "verdadero", si el texto de la vista de texto está configurado como seleccionable, expandiría la lista de lista en pan de jengibre pero no en jellybean y podría no funcionar en ICS.

1

Tuve un problema similar y se resolvió quitando la propiedad android:clickable="true" de ExpandableListView en xml.

0

forumListView.collapseGroup (groupPosition);

debe ser

forumListView.collapseGroup (i);

10

En caso de que tenga un widget en su elemento de la lista, como un botón, puede que tenga que agregarle android:focusable="false". El botón no permitía que se hiciera clic en mi elemento de la lista. Ese fue el problema en mi caso.

+0

¡Muchas gracias! –

+0

Esto me ayudó. – Omolara

+0

Puede que no funcione si lo haces en xml. Agregar button.setFocusable (falso); en java – Immy

1

Sé que esto ya fue respondida, pero trata de establecer el diseño de la base de lo que usted está inflando a tener el atributo:

android:descendantFocusability="blocksDescendants" 
Cuestiones relacionadas