Problema de estilo al superponer getDropDownView en ArrayAdapter

Estoy experimentando un comportamiento extraño al sobreescribir el método ArrayAdapter de ArrayAdapter . Necesito anular este método para mostrar el valor de cadena correcto fuera de mi objeto personalizado. Así es como se ve mi adaptador de matriz:

 ArrayAdapter<NoteType> adapter = new ArrayAdapter<NoteType>(this, android.R.layout.simple_spinner_item, lstNoteTypes){ @Override public View getView(int position, View convertView, ViewGroup parent) { TextView lbl = (TextView) super.getView(position, convertView, parent); lbl.setText(getItem(position).getName()); return lbl; } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { TextView lbl = (TextView) super.getView(position, convertView, parent); lbl.setText(getItem(position).getName()); return lbl; } }; adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

Así que cuando reemplazo getDropDownView , mi Spinner se ve como abajo – la altura del artículo es muy pequeño en tamaño y que no es lo que quiero:

Introduzca aquí la descripción de la imagen

Pero cuando comento (o no anule) el método getDropDownView , entonces se ve bien con el estilo por defecto, pero luego no puedo inyectar el valor de texto necesario en elementos de lista desplegable. Introduzca aquí la descripción de la imagen

Tenga en cuenta la altura de los elementos en ambas imágenes sólo por sobreescribir getDropDownView .

¿Alguna sugerencia? O lo que me falta en mi código?

Si escribió NoteType usted mismo, anule toString () en él. Simplemente agregue lo siguiente a su clase NoteType:

 @Override public String toString() { return getName(); } 

Creo que podría saber por qué sucede esto, pero tengo que probarlo, así que por ahora aquí hay otra solución (rápida).

Puesto que el Spinner llama a toString() en cada objeto del ArrayAdapter , puede sobrescribir el método toString() en su clase NoteType y dejar que devuelva su String (en lugar de la implementación toString() predeterminada). De esta manera no tendría que anular getDropDownView() en su adaptador, pero aún así tiene el estilo predeterminado y sus datos en él.

Me encontré con este mismo problema con una clase personalizada BaseAdapter. Esto también se mencionó en un comentario, pero la solución es en realidad muy simple: simplemente añada el relleno al TextView que regresa del método getDropDownView.

No deberías agregar ningún archivo adicional para esto y no estaba usando ActionBarSherlock (sólo el Spinner predeterminado), así que no creo que esté relacionado con eso. Aquí está el código que funcionó para mí, adaptado a su ejemplo:

 @Override public View getView(int position, View convertView, ViewGroup parent) { // Create custom TextView TextView lbl = (TextView) super.getView(position, convertView, parent); lbl.setText(getItem(position).getName()); // Add padding to the TextView, scaled to device final float scale = context.getResources().getDisplayMetrics().density; int px = (int) (10 * scale + 0.5f); lbl.setPadding(px, px, px, px); return lbl; } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { // Create custom TextView TextView lbl = (TextView) super.getView(position, convertView, parent); lbl.setText(getItem(position).getName()); // Add padding to the TextView, scaled to device final float scale = context.getResources().getDisplayMetrics().density; int px = (int) (10 * scale + 0.5f); lbl.setPadding(px, px, px, px); return lbl } 

Tenía que hacer lo mismo, así que hizo mi propia vista para ser utilizado como checkedTextView

En esto lo más importante es establecer la altura como para android: layout_height = "? Attr / dropdownListPreferredItemHeight" Yo estaba usando un adaptador de base

  • Spinner con ArrayAdapter personalizado para objetos que no muestran el elemento seleccionado
  • Android Canvas.drawTextOnPath no parece correcto cuando la pintura se establece en Stroke
  • SetBackground vs setBackgroundDrawable (Android)
  • ¿Hay una forma de compensar una vista desde el centro en Android?
  • Reciclando vistas en vista de desplazamiento
  • Uso de dos diseños diferentes para elementos secundarios en ExpandableListView
  • Registrarse en la transmisión local dentro de una vista personalizada
  • Android View.OnKeyListener: haga clic una vez, ejecute dos veces
  • Medición de la altura del texto a dibujar en lienzo (Android)
  • Android: cambiar LayoutParams de vista agregado por WindowManager
  • Diseño de vistas personalizadas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.