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 useiconvertView.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 usarsuper.getDropDownView(position, convertView, parent)
algumas vezes em vez de sempre criar uma nova visualização.Respostas:
Para ocultar um item arbitrário ou mais de um item, acho que você pode implementar seu próprio adaptador e definir o índice (ou lista de matriz de índices) que deseja ocultar.
E use seu adaptador personalizado ao criar a lista de itens.
(Eu não testei o código) espero que ajude.
fonte
É mais fácil ocultar um item no final da lista truncando a lista.
Mas você deve selecioná-lo primeiro para que apareça no botão giratório e, em seguida, verificar se a seleção foi alterada para um dos itens exibidos.
fonte
Para ocultar qualquer item no menu suspenso giratório, você precisa passar a posição do item que precisa ser escondido com base nos critérios exigidos. Eu consegui isso em um caso de uso de ocultar o item que é selecionado no menu suspenso
E configurar o adaptador é algo assim
Ao selecionar alguns itens da lista suspensa, também a posição precisa ser alterada
fonte
Apenas por interesse, criei uma solução para usar "Prompt" como uma dica. Este código é feito para
Xamarin.Android
, mas poderia ser perfeitamente portado para Java em 10 minutos. Use-o como um simples,ArrayAdapter
sem adicionar itens com índice 0 ou com contagem de itens ao array de origem. Também é definidoSpinnerGeolocation.SelectedItemId
como -1 quando nada é escolhido (hint
é o item atual).fonte
Encontrei esta solução que resolveu meu problema.
fonte
Acho que será melhor colocar a validação na Lista de Array em vez de no Spinner porque uma vez que o item é filtrado, será seguro adicionar no Spinner
fonte
Outra abordagem que funcionou melhor para mim é retornar um novo objeto de visualização em branco. Esta é uma abordagem consideravelmente limpa, pois você não está brincando com elementos de array.
Crie sua extensão de classe de adaptador
ArrayAdapter
dentro do seu método
fonte
Esta é uma pergunta muito antiga, mas eu encontrei uma maneira legal (e provavelmente) limpa de não mostrar os primeiros itens também. Inspirado pela resposta de @Romich, adicionei uma lógica semelhante para pular o (s) primeiro (s) item (ns).
Isso efetivamente oculta um número arbitrário de itens (1 por padrão). O código apenas relata que o tamanho dos objetos a serem renderizados é menor do que realmente é e também altera o índice de itens a serem renderizados, de modo que pulamos um número arbitrário de itens.
Para manter as coisas simples, excluí a solução que estou usando atualmente, que oferece suporte à ocultação de lista de itens aleatórios, mas que pode ser facilmente gerenciada por alguns ajustes no código.
fonte