Estoy buscando una forma de ocultar un elemento en un widget giratorio de Android. Esto le permitiría simular una ruleta sin elementos seleccionados y garantiza que la devolución de llamada onItemSelected () siempre se llame para cada elemento seleccionado (si el elemento oculto es el "actual"). Normalmente, siempre hay un elemento en la ruleta que no genera una devolución de llamada, a saber, el actual.
Hay algún código en stackoverflow sobre cómo deshabilitar (atenuar) elementos, pero no cómo ocultar elementos por completo como si no existieran.
Después de mucha experimentación, se me ocurrió una solución algo hack-ish que funciona en varias plataformas Android antiguas y nuevas. Tiene algunos inconvenientes cosméticos menores que son difíciles de notar. Todavía me gustaría oír hablar de una solución más oficial, aparte de "no hagas eso con una ruleta".
Esto siempre oculta el primer elemento de la ruleta, pero podría ampliarse fácilmente para ocultar un elemento arbitrario o más de un elemento. Agregue un elemento ficticio que contenga una cadena vacía al comienzo de su lista de elementos giratorios. Es posible que desee establecer la selección de ruleta actual en el elemento 0 antes de que se abra el cuadro de diálogo de la ruleta, esto simulará una ruleta no seleccionada.
Ejemplo de configuración de Spinner con anulación del método ArrayAdapter:
List<String> list = new ArrayList<String>();
list.add(""); // Initial dummy entry
list.add("string1");
list.add("string2");
list.add("string3");
// Populate the spinner using a customized ArrayAdapter that hides the first (dummy) entry
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list) {
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent)
{
View v = null;
// If this is the initial dummy entry, make it hidden
if (position == 0) {
TextView tv = new TextView(getContext());
tv.setHeight(0);
tv.setVisibility(View.GONE);
v = tv;
}
else {
// Pass convertView as null to prevent reuse of special case views
v = super.getDropDownView(position, null, parent);
}
// Hide scroll bar because it appears sometimes unnecessarily, this does not prevent scrolling
parent.setVerticalScrollBarEnabled(false);
return v;
}
};
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mySpinner.setAdapter(dataAdapter);
tv.setVisibility(View.GONE);
línea es innecesaria. Comentarlo no parece hacer ninguna diferencia (visual), al menos en Android 4.4.2 / KitKit (en un LG / Google Nexus 4).setTag(1)
en el textView en la posición 0, luego lo uséconvertView.getTag() != null
para determinar si la vista reutilizada era la vista de altura 0 creada para la posición 0 o una vista normal usada para otros elementos giratorios. Esto fue para que pudiera usarlo asuper.getDropDownView(position, convertView, parent)
veces en lugar de crear siempre una nueva vista.Respuestas:
Para ocultar un elemento arbitrario o más de un elemento, creo que puede implementar su propio adaptador y establecer el índice (o lista de matriz de índices) que desea ocultar.
Y use su adaptador personalizado cuando cree la lista de elementos.
(No he probado el código) espero que ayude.
fuente
Es más fácil ocultar un elemento al final de la lista truncando la lista.
Pero primero debe seleccionarlo para que aparezca en la ruleta y luego verificar si la selección se ha cambiado a uno de los elementos mostrados.
fuente
Para ocultar cualquier elemento en el menú desplegable giratorio, debe pasar la posición del elemento que debe ocultarse según los criterios requeridos. Lo he logrado en un caso de uso de ocultar el elemento que se selecciona del menú desplegable
Y configurar el adaptador es algo como esto
Al seleccionar algunos elementos del menú desplegable, también se debe cambiar la posición
fuente
Solo por interés, hice una solución para usar "Prompt" como pista. Este código está hecho para
Xamarin.Android
, pero podría ser perfectamente portado a Java en 10 minutos. Úselo como un simpleArrayAdapter
sin agregar elementos indexados con 0 o indexados por conteo a la matriz de origen. También se estableceSpinnerGeolocation.SelectedItemId
en -1 cuando no se elige nada (hint
es el elemento actual).fuente
Encontré esta solución que resolvió mi problema.
fuente
Creo que será mejor poner la validación en la Lista de matrices en lugar de en Spinner porque una vez que se filtra el elemento, será seguro agregarlo en Spinner
fuente
Otro enfoque que funcionó mejor para mí es devolver un nuevo objeto de vista en blanco. Este es un enfoque considerablemente limpio ya que no está jugando con elementos de matriz.
Crea tu clase de adaptador ampliando
ArrayAdapter
dentro de tu método
fuente
Esta es una pregunta muy antigua, pero encontré una manera agradable (y probablemente) limpia de no mostrar también los primeros elementos. Inspirado por la respuesta de @ Romich, agregué una lógica similar para omitir el primer elemento (s).
Esto oculta efectivamente un número arbitrario de elementos (1 por defecto). El código solo informa que el tamaño de los objetos a representar es más corto de lo que realmente es y también cambia el índice de elementos a representar, por lo que omitimos un número arbitrario de elementos.
Para simplificar las cosas, he excluido la solución que estoy usando actualmente y que admite la ocultación de la lista de elementos aleatorios, pero que se puede administrar fácilmente con algunos ajustes en el código.
fuente