2010-09-02 18 views
5

He estado jugando con vistas de lista ampliables recientemente.Android: ExpandableListViews y casillas de verificación

Estoy tratando de obtener una vista de lista que tenga una casilla de verificación como uno de los elementos de la vista secundaria.

Encontré este tutorial, http://mylifewithandroid.blogspot.com/2010/02/expandable-lists-and-check-boxes.html, y me pareció perfecto. Sin embargo, cuando lo compilé y comencé a jugar con él, me di cuenta de que era muy defectuoso. La comprobación de un cuadro en un grupo puede hacer que un recuadro al azar de otro grupo marque o desmarque.

Este es el único tutorial que puedo encontrar sobre esto, parece algo que se usaría en muchas aplicaciones, entonces me preguntaba, ¿hay algún otro buen tutorial o recurso que trate con esto?

o mejor aún, ¿alguien cuidar para mostrar su propio código de haber conseguido que esto funcione ...

Gracias

Kev

Respuesta

3

que tenía el mismo problema en el desarrollo de un cliente a nagios androide, y he encontrado, es crucial que se asigna un nuevo valor al parámetro convertView tanto en el

  • public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) y
  • public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent)

métodos en su BaseExpandableListAdapter extensión.

De lo contrario, los renderizadores padre/hijo se crearán desde el caché, y no le mostrarán las cosas correctas.

Necesito la casilla de verificación para mostrar si el usuario necesita algún tipo de alerta si algo va mal con el servicio observado.

Aquí es mi manera de conseguir esto:

//hosts: the list of data used to build up the hierarchy shown by this adapter's parent list. 
private class MyExpandableListAdapter extends BaseExpandableListAdapter 
{ 
    private LayoutInflater inflater; 

    public MyExpandableListAdapter() 
    { 
     inflater = LayoutInflater.from(Binding.this); 
    } 

    @Override 
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) 
    { 
     final Host host = hosts.get(groupPosition); 
     final boolean needsLargeView = isExpanded && (host.getTitle() != null) && (host.getTitle().length() > 0); 
     if (needsLargeView) 
      convertView = inflater.inflate(R.layout.grouprow_expanded, parent, false); 
     else 
      convertView = inflater.inflate(R.layout.grouprow, parent, false); 
     convertView.setBackgroundResource(host.getBackgroundResource(isExpanded)); 
     [...] 
     return convertView; 
    } 

    @Override 
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) 
    { 
     final Host host = hosts.get(groupPosition); 
     final NagService service = host.getServices().get(childPosition); 
     convertView = inflater.inflate(R.layout.childrow, parent, false); 
     convertView.setBackgroundResource(host.getChildBackgroundResource()); 
     convertView.findViewById(R.id.servicename_status).setBackgroundResource(service.getStatusBackground()); 
     [...] 
     CheckBox alertChb = (CheckBox) convertView.findViewById(R.id.alert); 
     alertChb.setChecked(service.isNeedsAlert()); 
     alertChb.setOnCheckedChangeListener(new YourCheckChangedListener(service)); 
     return convertView; 
    } 

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

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

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

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

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

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

    @Override 
    public void notifyDataSetChanged() 
    { 
     super.notifyDataSetChanged(); 
    } 

    @Override 
    public boolean isEmpty() 
    { 
     return ((hosts == null) || hosts.isEmpty()); 
    } 

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

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

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

El childrow.xml entre los diseños utilizados es el que contiene la casilla de verificación.

Dentro del CheckedChanhedListener debe guardar el nuevo estado en la instancia afectada (en mi caso, el servicio).

espero que esto le ayuda

0

esto es lo que encontré en el que se le da una buena pauta cómo podemos hacer vista de lista personalizada ya sea una casilla de verificación o cualquier TextView dentro de vista de lista

http://techdroid.kbeanie.com/2009/07/custom-listview-for-android.html

Gracias ..

Rakesh

+0

Gracias Rakesh, parece un buen tutorial, pero parece tratar sólo con listviews, en las que a mí más intereseted en ExpandableListViews .. –

Cuestiones relacionadas