Cómo agregar secciones separadores / divisores a un ListView?

Actualmente estoy haciendo un menú para mi aplicación, usando una subclase de DrawerLayout y ArrayAdapter para lograr algo parecido al menú del cajón de Facebook.

Actualmente no tengo problemas para crear la lista, pero ahora que se ve bien, me gustaría añadir separadores entre diferentes tipos de opciones (es decir, relacionadas con el usuario y las opciones relacionadas con la aplicación) y una barra de búsqueda en la parte superior del menú.

El código de mi subclase ArrayAdaptor actual es el siguiente:

public class DrawerMenuAdapter extends ArrayAdapter<String>{ private Context context; private String[] values; private int resId; public DrawerMenuAdapter(Context context, int textViewResourceId, String[] values) { super(context, textViewResourceId, values); this.context = context; this.values = values; this.resId = textViewResourceId; } @Override public View getView(int position, View convertView, ViewGroup parent){ LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View rowView = inflater.inflate(this.resId, parent, false); TextView elementText = (TextView)rowView.findViewById(R.id.element_text); ImageView elementImage = (ImageView)rowView.findViewById(R.id.element_icon); String textValue = values[position]; elementText.setText(textValue); //This switch adds the icons to the related elements switch (position){ case 0: elementImage.setImageResource(R.drawable.search); break; case 1: elementImage.setImageResource(R.drawable.facebook_friends); break; case 2: elementImage.setImageResource(R.drawable.flirts_history); break; case 3: elementImage.setImageResource(R.drawable.premium); break; case 4: elementImage.setImageResource(R.drawable.settings); break; case 5: elementImage.setImageResource(R.drawable.share_app); break; case 6: elementImage.setImageResource(R.drawable.cgu); break; } return rowView; } } 

Supongo que tengo que anular la función que rellena el ListView llamando a la función getView, pero no puedo encontrar qué función es.

Si desea secciones simples en su ListView , eche un vistazo a este tutorial:

http://cyrilmottier.com/2011/07/05/listview-tips-tricks-2-section-your-listview/

O este tutorial:

http://bartinger.at/listview-with-sectionsseparators/

La segunda no es tan detallada, pero probablemente más fácil de entender / mantenerse más simple.

La idea básica es que haga que su ListAdapter tenga diferentes tipos de vistas. Por ejemplo, dos vistas diferentes donde un tipo es el elemento de lista real que muestra la información y el otro tipo de vista es el divisor de sección.

Del tutorial:

ListViews y más específicamente Adapters pueden manejar varios tipos de Views . Si echa un vistazo a la interfaz del adaptador, notará que contiene dos métodos específicos:

  • getViewTypeCount() que devuelve el número de tipos de vistas que su AdapterView gestiona. La mayoría de las veces este método devuelve 1 porque todos los elementos de ListView son similares. En este caso, al devolver 2, el ListView manejará dos tipos de vistas: el elemento regular Vistas y el separador Vistas
  • getItemViewType(int) debe devolver un entero entre 0 (inclusive) y getViewTypeCount() (exclusivo). El número dado expresa el tipo de la Vista en la posición dada. Por ejemplo, podemos asegurar que los valores devueltos son 0 para el elemento regular Vistas y 1 para los separadores

Estoy agregando una respuesta aquí, ya que he encontrado otra forma de hacerlo. Se parece un poco a los enlaces @Phil publicado.

En primer lugar, establecer una matriz de cadena del menú que quiero mostrar. He escrito esta matriz en un archivo de recursos XML para su conveniencia personal.

 <?xml version="1.0" encoding="utf-8"?> <resources> <string-array name="drawer_menu_options"> <item>Username</item> <item>-sep-Flirter</item> <item>Recherche</item> <item>Amis Facebook</item> <item>Flirts</item> <item>Compte premium</item> <item>-sep-Menu</item> <item>Réglages</item> <item>Inviter des amis</item> <item>CGU</item> </string-array> </resources> 

Observe que tengo dos elementos usando el prefijo -sep- . Estos serán nuestros separadores.

Luego viene el DrawerMenuAdapter que he mostrado anteriormente, que sigue siendo un ArrayAdapter, en el que he añadido algunas funcionalidades:

 public class DrawerMenuAdapter extends ArrayAdapter<String>{ private Context context; private String[] values; private int resId; private int separatorId = 0; private int userbarId = 0; public DrawerMenuAdapter(Context context, int textViewResourceId, String[] values) { super(context, textViewResourceId, values); this.context = context; this.values = values; this.resId = textViewResourceId; } public void setSeparator(int resId){ separatorId = resId; } public void setUserbarId(int resId){ userbarId = resId; } @Override public View getView(int position, View convertView, ViewGroup parent){ View rowView; LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); if(userbarId != 0 && values[position].equals("Username")){ rowView = inflater.inflate(this.userbarId, parent, false); }else if(separatorId != 0 && values[position].startsWith("-sep-")){ rowView = inflater.inflate(this.separatorId, parent, false); }else{ rowView = inflater.inflate(this.resId, parent, false); } TextView elementText = (TextView)rowView.findViewById(R.id.element_text); String textValue = values[position]; /* If the current line is a separator, just display a separator. Otherwise, set the matching picture */ if(textValue.startsWith("-sep-")){ elementText.setText(textValue.substring("-sep-".length())); }else{ if(textValue.equals("Username")){ elementText.setText(context.getSharedPreferences("LovRUserSettings", 0) .getString("firstName", "Username")); }else{ elementText.setText(textValue); } ImageView elementImage = (ImageView)rowView.findViewById(R.id.element_icon); switch (position){ case 2: elementImage.setImageResource(R.drawable.search); break; case 3: elementImage.setImageResource(R.drawable.facebook_friends); break; case 4: elementImage.setImageResource(R.drawable.flirts_history); break; case 5: elementImage.setImageResource(R.drawable.premium); break; case 7: elementImage.setImageResource(R.drawable.settings); break; case 8: elementImage.setImageResource(R.drawable.share_app); break; case 9: elementImage.setImageResource(R.drawable.cgu); break; } } return rowView; } } 

En este código, hay un objeto llamado userBar . Realmente no necesita prestar atención a esto, pero si está interesado, es otro elemento de menú, que utiliza un archivo de diseño específico en lugar del que utilizo para elementos de menú normales. Es una manera de demostrar que puede agregar cualquier tipo de diseño específico en cualquier lugar que desee, solo leyendo sus cadenas.

El punto principal aquí es en la forma en que el código busca separadores, las cadenas con el prefijo -sep- . Una vez que uno se encuentra, el prefijo se elimina, y el diseño correspondiente se atribuye al separador.

Aight, eso es lo que he encontrado. Después de esto, usted tendrá que encontrar su propia manera de agregar oyentes de clic. Las minas se implementan en el DrawerLayout.setOnCliclListener que básicamente hace el trabajo de la misma manera que la documentación de Google dice. Pero también puede usar setOnclickListener en su vista a medida que los agrega, y usar un archivo XML donde puede establecer sus propios atributos onClick

Espero que ayude =)

  • ¿Cómo hacer que el primer elemento de un ListView se seleccione como predeterminado en el inicio?
  • Android convertView, para usarlo o no?
  • ListFragment OnListItemClick no se llama
  • ¿Cómo puede escuchar los eventos de clic en un ListView que se producen fuera de los elementos de la lista?
  • Problemas al integrar EnhancedListView y SwipeRefreshLayout
  • ¿Cómo ocultar y mostrar correctamente la barra de acciones con la nueva API de la biblioteca de diseño?
  • Cómo manejar largo toque en el elemento ListView?
  • Obtener datos de JSON en la vista de lista
  • Teclado cubre la pantalla en lugar de empujar hasta el diseño?
  • ListView no se llena, getView () no se recibe
  • ¿Establecer etiquetas para cada elemento en un ListView en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.