Estou tentando usar um RecyclerView
como horizontal ListView
. Estou tentando descobrir como destacar o item selecionado. Quando clico em um dos itens, ele é selecionado e é destacado corretamente, mas quando clico em outro, o segundo é destacado com o mais antigo.
Aqui está minha função onClick:
@Override
public void onClick(View view) {
if(selectedListItem!=null){
Log.d(TAG, "selectedListItem " + getPosition() + " " + item);
selectedListItem.setBackgroundColor(Color.RED);
}
Log.d(TAG, "onClick " + getPosition() + " " + item);
viewHolderListener.onIndexChanged(getPosition());
selectedPosition = getPosition();
view.setBackgroundColor(Color.CYAN);
selectedListItem = view;
}
Aqui está o onBindViewHolder
:
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
viewHolder.setItem(fruitsData[position]);
if(selectedPosition == position)
viewHolder.itemView.setBackgroundColor(Color.CYAN);
else
viewHolder.itemView.setBackgroundColor(Color.RED);
}
android
android-recyclerview
recycler-adapter
user65721
fonte
fonte
Respostas:
Eu escrevi uma classe de adaptador base para lidar automaticamente com a seleção de itens com um RecyclerView. Basta derivar seu adaptador e usar listas de estados extraíveis com state_selected, como você faria com uma exibição de lista.
Eu tenho uma postagem no blog aqui sobre isso, mas aqui está o código:
fonte
mRecyclerView
não é declarado em nenhum lugar. Devemos apenas passá-lo como um parâmetro no construtor e armazená-lo em um campo?onRecyclerViewAttached
e armazene-o em uma variável de membro lá.TrackSelectionAdapter
classe e usá-la na minha lista? Como faço para "derivar meu adaptador da sua classe"? Por favor, você poderia responder à minha pergunta? Estou preso tão profundamente: stackoverflow.com/questions/29695811/...Esta é uma maneira muito simples de fazer isso.
Tenha um
private int selectedPos = RecyclerView.NO_POSITION;
na classe do adaptador RecyclerView e, no método onBindViewHolder, tente:E no seu evento OnClick, modifique:
Funciona como um encanto para a Gaveta de navegação e outros adaptadores de itens do RecyclerView.
Nota: Certifique-se de usar uma cor de fundo no layout usando um seletor como colabug esclarecido:
Caso contrário, setSelected (..) não fará nada, tornando esta solução inútil.
fonte
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/pressed_color" android:state_pressed="true"/> <item android:drawable="@color/selected_color" android:state_selected="true"/> <item android:drawable="@color/focused_color" android:state_focused="true"/> </selector>
vieHolder.getLayoutPosition
ATUALIZAÇÃO [26 / Jul / 2017]:
espero que isso ajude.
fonte
É provável que sua implementação funcione se você rolar o conteúdo para fora da visualização e voltar à visualização. Eu estava tendo um problema semelhante quando me deparei com sua pergunta.
O seguinte snippet de arquivo está funcionando para mim. Minha implementação foi direcionada à seleção múltipla, mas lancei um hack para forçar a seleção única. (* 1)
Conforme observado nesta pergunta vinculada , a configuração de listeners para viewHolders deve ser feita no onCreateViewHolder. Eu esqueci de mencionar isso anteriormente.
fonte
Acho que encontrei o melhor tutorial de como usar o RecyclerView com todas as funções básicas necessárias (única + multisseleção, destaque, ondulação, clique e remover na multisseleção, etc ...).
Aqui está -> http://enoent.fr/blog/2015/01/18/recyclerview-basics/
Com base nisso, consegui criar uma biblioteca "FlexibleAdapter", que estende um SelectableAdapter. Eu acho que isso deve ser uma responsabilidade do adaptador; na verdade, você não precisa reescrever as funcionalidades básicas do adaptador todas as vezes, deixe uma biblioteca fazer isso, para que você possa reutilizar a mesma implementação.
Este adaptador é muito rápido, funciona imediatamente (você não precisa estendê-lo); você personaliza os itens para todos os tipos de exibição necessários; O ViewHolder é predefinido: eventos comuns já estão implementados: clique único e longo; mantém o estado após a rotação e muito mais .
Dê uma olhada e sinta-se à vontade para implementá-lo em seus projetos.
https://github.com/davideas/FlexibleAdapter
Um Wiki também está disponível.
fonte
Veja a minha solução. Suponho que você deve definir a posição selecionada no suporte e passá-la como Tag of View. A visualização deve ser definida no método onCreateViewHolder (...). Também há um local correto para definir o ouvinte para exibição, como OnClickListener ou LongClickListener.
Por favor, veja o exemplo abaixo e leia os comentários no código.
fonte
não há seletor no RecyclerView como o ListView e o GridView, mas você tenta abaixo o que funcionou para mim
crie um drawer seletor como abaixo
defina esse desenho como plano de fundo do layout da linha do RecyclerView como
fonte
Decisão com interfaces e retornos de chamada. Crie uma interface com estados de seleção e desmarcação:
Implementar interface no ViewHolder:
Execute a alteração de estado no retorno de chamada:
Crie o RecyclerView com retorno de chamada (exemplo):
Veja mais no artigo do iPaulPro: https://medium.com/@ipaulpro/drag-and-swipe-with-recyclerview-6a6f0c422efd#.6gh29uaaz
fonte
esta é a minha solução, você pode definir um item (ou um grupo) e desmarcar com outro clique:
fonte
Eu tive o mesmo problema e resolvo-o da seguinte maneira:
O arquivo xml que está usando para criar uma linha dentro do createViewholder, basta adicionar a linha abaixo:
OU Se você estiver usando o frameLayout como pai do item de linha, então:
No código java dentro do suporte da vista em que você adicionou no ouvinte de clique:
fonte
Não consegui encontrar uma boa solução na Web para esse problema e resolvi-a. Há muitas pessoas que sofrem com esse problema. Assim, eu quero compartilhar minha solução aqui.
Durante a rolagem, as linhas são recicladas. Portanto, as caixas de seleção marcadas e as linhas destacadas não funcionam corretamente. Resolvi esse problema escrevendo a classe do adaptador abaixo.
Eu também implemento um projeto completo. Neste projeto, você pode selecionar várias caixas de seleção. Linhas incluindo caixas de seleção selecionadas são destacadas. E o mais importante, eles não são perdidos durante a rolagem. Você pode baixá-lo no link:
https://www.dropbox.com/s/ssm58w62gw32i29/recyclerView_checkbox_highlight.zip?dl=0
Capturas de tela do aplicativo:
fonte
Defina
private int selected_position = -1;
para impedir que qualquer item seja selecionado no início.fonte
Apenas adicionar
android:background="?attr/selectableItemBackgroundBorderless"
deve funcionar se você não tiver a cor de fundo, mas não se esqueça de usar o método setSelected. Se você tem uma cor de fundo diferente, usei isso (estou usando ligação de dados);Definir isSelected na função onClick
E adicione isso ao xml;
fonte
Faça o seletor:
Defina-o como plano de fundo no layout do item da lista
No seu adaptador, adicione OnClickListener à visualização (método onBind)
No evento onClick, ative a visualização:
fonte