¿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
- Barra de búsqueda personalizada con los bordes cortados
- ¿Android View.postDelayed referencia de la fuga?
- Android mapview con fragmentos no se puede agregar dos veces?
- ¿Cómo obtener la vista raíz de la aplicación Android de React Native?
- ¿Cómo comprobar si una viewStub ya está inflada?
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; }
- Cargar HTML estático en Webview
- Problema de renderización de ViewPager personalizado en ciertos dispositivos:
- Custom Seekbar con efecto de enmascarar con dos estirables?
- Vista flotante en la pantalla de Android
- Android: Obtener la posición de desplazamiento de un WebView
- addView no funciona
- Android Studio 2.2.0.12 diseñador automáticamente anuncios "@ + id" prefijo antes de la identificación de la vista y que causa este error inusual
- Cómo iniciar una actividad desde la vista personalizada
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; } } //-------------------------
- XML con la biblioteca SimpleXML – Rendimiento en Android
- Cordova No se pudo reservar espacio suficiente para 2097152KB objeto montón