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 a super.getDropDownView(position, convertView, parent)
veces en lugar de crear siempre una nueva vista.