2012-08-05 7 views
21

Tengo una lista desplegable. He puesto algunos datos ficticios y todo parece estar bien, pero cuando ejecuto la aplicación, todos los grupos están en modo colapsar y no tienen efecto cuando hago clic en cada uno de ellos. esta es la captura de pantalla: enter image description hereAndroid, la vista de la lista desplegable no tiene reacción al clic !!! no expande

XML del Grupo es:

<?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 del niño es:

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

y en main.xml, la definición de la lista ampliable es:

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

Tengo un adaptador que he escrito este código para eso:

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

} 

y, finalmente, en el código de la actividad fragmento que tengo:

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

} 

Cuando ejecuto la aplicación y haga clic padres om no pasa nada. He intentado añadir siguientes líneas de código al final de la clase comercial:

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

Ahora, cuando corro el resultado de aplicación es como captura de pantalla: enter image description here

Si hago clic en los botones de eliminación (padre o hijo), Puedo ver que surten efecto (mientras reviso logcat), sin embargo, cuando hago clic en "hijo" o "padre", no ocurre nada. Entonces, no tengo idea de por qué las devoluciones de llamada no funcionan. Basado en mi investigación, descubrí que necesito establecer Focussable de botones de imagen en false. Como puede ver en los archivos XML, lo hice pero aún cuando hago clic en las filas padre e hijo no puedo ver ninguna respuesta.

Como pasé más de 6-7 horas buscando una solución y no fue exitosa, agradezco sinceramente sus comentarios y sugerencias. Gracias

Respuesta

31

fin encontré la solución :)

no tengo idea de que es error o enfermedad o ...

Como se mencionó anteriormente basado en mi investigación he encontrado que hay que ajustar el enfoque-capacidad de la vista/cuadro de la imagen a "falso". Lo hice en un archivo XML y no funcionó. Establecí la capacidad de foco en "verdadero" en XML y en el código lo establecí en falso. de esta manera:

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

¡Por lo tanto, basado en mi logro! ¡debe establecerse en "falso" en código no en XML! Ahora la pregunta es ¿Cuál es la diferencia? -No tengo idea.

+0

Funciona.Aunque no es necesario definir ningún atributo enfocable en el archivo XML de diseño. – emaringolo

+0

Nota: tenemos que poner android: focusable = "false" en

+0

Después de horas de depuración, cuando configuré focalizable a falso a través del código, el clic en mi vista expansible comenzó a disparar. Esto es muy raro ¿Alguien sabe por qué? –

3

Es necesario definir android:focusable="false" en el xml diseño para las vistas enfocable dentro del elemento de la lista vista ampliable pero no en el "ExpandableListView" atributo.

Por ejemplo: si un elemento de lista principal personalizado incluye una casilla de verificación (obtendrá el foco automáticamente) debería ser como a continuación.

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