¿Diversas vistas para el artículo del hilandero y del hilandero?

¿Hay alguna manera de que pueda establecer una vista diferente para la vista de spinner cerrado y la vista de elemento spinner?

Supongo que el identificador de recursos utilizado en el ArrayAdapter se utilizaría para la vista de elementos cerrados, así como las vistas de elementos, así que extendí el ArrayAdapter y getView el getView que utiliza un recurso diferente, pero el id de recurso en la llamada a la Super constructor no parece ser utilizado nunca, sólo el recurso id utilizado en getView parece ser utilizado

En el código Spinner.java dice:

Un adaptador giratorio permite definir dos vistas diferentes: una que muestra los datos en el propio hilandero y uno que muestra los datos en la lista desplegable cuando se pulsa el hilador.

Pero no parece posible dado el código.

De todos modos – mi código:

 public class CustomArrayAdapter <T> extends ArrayAdapter<T> { int itemViewResourceId; private LayoutInflater inflater; ViewPopulator<T> viewPopulator; private List<T> objects; public CustomArrayAdapter(Context context, int textViewResourceId, int itemViewResourceId, ViewPopulator<T> viewPopulator, List<T> objects) { super(context, textViewResourceId, objects); inflater = LayoutInflater.from(context); this.viewPopulator = viewPopulator; this.itemViewResourceId = itemViewResourceId; this.objects = objects; } @Override public View getView(int position, View convertView, ViewGroup parent) { if(convertView == null || convertView.getTag() == null) { // new view - populate convertView = inflater.inflate(itemViewResourceId, parent, false); convertView.setTag(new Object()); } viewPopulator.populateView(position, convertView, parent, objects.get(position)); return convertView; } } public abstract class ViewPopulator<T> { public abstract void populateView(int position, View convertView, ViewGroup parent, T item); } 

Llamado con:

 CustomArrayAdapter<T> typeAdapter = new CustomArrayAdapter<T>(context, R.layout.list_item, R.layout.list_item_big, new ViewPopulator<T>() { @Override public void populateView(int position, View convertView, ViewGroup parent, T item) { ((TextView) convertView.findViewById(R.id.list_item)).setText(position + " - " + item.getName()); } }, itemsByType.get(type)); 

** EDIT **

El identificador de recurso utilizado es el itemViewResourceId definido en el método getView – añadiendo un nuevo método a CustomArrayAdapter , reemplazando getDropDownView como a continuación, me da los mismos resultados del itemViewResourceId se utiliza para todo el estilo y el textViewResourceId no se utiliza en absoluto. Sin embargo, la eliminación de los resultados getView en el textViewResourceId se utiliza – por lo tanto no creo que getDropDownView realmente hace nada:

  @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { if(convertView == null || convertView.getTag() == null) { // new view - populate convertView = inflater.inflate(itemViewResourceId, parent, false); convertView.setTag(new Object()); } viewPopulator.populateView(position, convertView, parent, objects.get(position)); return convertView; } 

Si implementas SpinnerAdapter ¿te ayuda? El siguiente código funciona para mí:

 private class CustomSpinnerAdapter extends BaseAdapter implements SpinnerAdapter { String[] values; Context context; public NumberSpinnerAdapter(String[] values) { this.values = values; this.context = context; } @Override public int getCount() { return values.length; } @Override public Object getItem(int position) { return values[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { TextView textView = (TextView) View.inflate(context, android.R.layout.simple_spinner_item, null); textView.setText(values[position]); return textView; } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { TextView textView = (TextView) View.inflate(context, android.R.layout.simple_spinner_dropdown_item, null); textView.setText(values[position]); return textView; } } 

Aunque esta es una vieja pregunta, me tropecé tratando de resolver el mismo problema. Yo uso setDropDownViewResource :

 Spinner mySpinner = (Spinner) mView.findViewById(R.id.mySpinner); ArrayAdapter<String> myAdapter = new ArrayAdapter<String>(...); myAdapter.setDropDownViewResource(R.layout.my_simple_spinner_dropdown_item); mySpinner.setAdapter(adapter); 

En realidad, obtener diferentes View s para Spinner expandido (abierto) y colapsado (cerrado) es tan simple como reemplazar los métodos getView y getDropdownView de su adaptador.

getView(int position, View convertView, ViewGroup parent) producirá todas las View que se utilizarán para mostrar un elemento seleccionado cuando el Spinner se contrae.

getDropDownView(int position, View convertView, ViewGroup parent) se llama cuando hace clic en un Spinner para expandirlo y mostrar una lista desplegable de sus elementos. Puede llamar a getView desde este método (si sus elementos en estados expandidos y contraídos son similares) o producir una View diferente para el elemento en su lista desplegable.

Sería bueno si anular ambos métodos de todos modos (incluso si su getDropdownView sólo llama getView con los mismos argumentos). Y no se olvide de usar su parámetro convertView – está aquí para un propósito de optimización ( para reutilizar vistas existentes en lugar de inflarlas / crearlas cada vez ):

 public View getView(int position, View convertView, ViewGroup parent) { ... if(convertView == null){ convertView = View.inflate(getContext(), R.layout.dropdown_category_color, null); } //...do your stuff with your View return convertView; } 
 CustomArrayAdapter<T> typeAdapter = new CustomArrayAdapter<T>(context, R.layout.list_item, R.layout.list_item_big, new ViewPopulator<T>() { @Override public void populateView(int position, View convertView, ViewGroup parent, T item) { ((TextView) convertView.findViewById(R.id.list_item)).setText(position + " - " + item.getName()); } }, itemsByType.get(type)); 
 //1--------------- package testing; public class SpinnerItemAdapterData { public int id ; public String name; public SpinnerItemAdapterData(int id, String name) { this.id = id; this.name = name; } public int getId(){ return this.id; } public String getName(){ return this.name; } } //------------------------- 
  • ¿Cómo encadenar la animación en android a la misma vista?
  • ¿Cómo replicar el botón de acción flotante Inbox (con texto para cada botón secundario)?
  • SYSTEM_UI_FLAG_LOW_PROFILE no se puede resolver o no es un campo para google threadsample
  • cómo establecer el color de texto de webview en android
  • Lista extensible de Multichild android
  • ¿Por qué mi tamaño de fuente parece mucho más grande en el objeto de vista web android que cuando se ve en el navegador de Android?
  • Android 3.0, Vista previa de widgets
  • android webview Relacionados
  • Cómo mostrar el contenido web en iOS y Android mediante QML
  • Error de WebView. Haciendo una aplicación para Android para ver mi sitio web
  • Android: ExpandableListViews y casillas de verificación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.