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ú.
- Horizontal ListView
- Cómo crear Google + tarjetas de interfaz de usuario en una vista de lista?
- ListView clic largo no funciona cuando un botón está en la lista
- Custom ListAdapter consistente en EditText pierde el foco llamado dos veces
- Su contenido debe tener un ListView cuyo atributo id es 'android.R.id.list'
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.
- Acceder a objetos personalizados en una vista de lista
- ListView Selector no funciona con el conjunto de fondo de ListViewItem
- No se puede reanudar la actividad
- La vista de lista con zoom no se desplaza
- Cambio de fondo del elemento de vista de lista de Android
- Implementación de una vista de lista con selección múltiple con filtro utilizando un adaptador de cursor
- ListView con disposición de filas personalizada - Android
- Android: ¿Qué hacer si el rendimiento de ListView sigue siendo insuficiente?
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:
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) ygetViewTypeCount()
(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 establecer el valor por defecto de Spinner como nulo?
- Android Studio 2.2 Vista previa de todos los tamaños de pantalla que faltan