Estou procurando uma maneira de ocultar um item em um widget giratório do Android. Isso permitiria que você simule um botão giratório sem nenhum item selecionado e garante que o retorno de chamada onItemSelected () seja sempre chamado para cada item selecionado (se o item oculto for o "atual"). Normalmente, há sempre um item no botão giratório que não gera um retorno de chamada, ou seja, o atual.
Há algum código em stackoverflow sobre como desabilitar (acinzentar) itens, mas não como ocultar itens completamente como se eles não existissem.
Depois de muita experimentação, eu vim com uma solução um tanto hack-ish que funciona em várias plataformas Android antigas e novas. Tem algumas desvantagens estéticas menores que são difíceis de notar. Eu ainda gostaria de ouvir uma solução mais oficial, diferente de "não faça isso com um spinner".
Isso sempre oculta o primeiro item no botão giratório, mas pode ser facilmente estendido para ocultar um item arbitrário ou mais de um item. Adicione um item fictício contendo uma string vazia no início de sua lista de itens giratórios. Você pode querer definir a seleção do botão giratório atual para o item 0 antes que a caixa de diálogo do botão giratório seja aberta, isso simulará um botão giratório não selecionado.
Exemplo de configuração do spinner com modificação do 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);
linha é desnecessária. Comentar não parece fazer nenhuma diferença (visual), pelo menos no Android 4.4.2 / KitKit (em um LG / Google Nexus 4).
setTag(1)
no textView na posição 0 e depois usei convertView.getTag() != null
para determinar se a visualização reutilizada era a visualização de altura 0 criada para a posição 0 ou uma visualização normal usada para outros itens giratórios. Isso era para que eu pudesse usar super.getDropDownView(position, convertView, parent)
algumas vezes em vez de sempre criar uma nova visualização.