Estou substituindo o meu ListView
com RecyclerView
, lista que mostra está bem, mas eu gostaria de saber como obter item clicado e sua posição, semelhante ao método OnItemClickListener.onItemClick(AdapterView parent, View v, int position, long id)
que usamos em ListView
.
Obrigado pelas ideias!
Respostas:
Com base no link: Por que o RecyclerView não tem onItemClickListener ()? e como o RecyclerView é diferente do Listview? , e também a ideia geral de @Duncan, dou minha solução aqui:
Defina uma interface
RecyclerViewClickListener
para passar mensagem do adaptador paraActivity
/Fragment
:Em
Activity
/Fragment
implemente a interface e também passe o ouvinte ao adaptador:Em
Adapter
eViewHolder
:Após o teste, ele funciona bem.
[ ATUALIZAÇÃO ]
Desde a API 22,
RecyclerView.ViewHoler.getPosition()
está obsoleto, portanto, em vez degetLayoutPosition()
.fonte
private static RecyclerViewClickListener itemListener;
de uma forma estática no construtor.onBindViewHolder
. Além disso, o item da minha lista não era totalmente clicável (apenas parte do item).new MyRecyclerViewAdapter(context, this)
:? Isso pode causar vazamentos de memóriapublic void recyclerViewListClicked(View v, int position);
O modificadorpublic
é redundante para métodos de interfacefonte
Aqui está um exemplo para definir um ouvinte de cliques.
fonte
int position = getAdapterPosition();
Coloque este código onde você define a visualização do reciclador em atividade.
Em seguida, faça uma classe separada e coloque este código:
fonte
crie o arquivo java com o código abaixo
e apenas use o listener em seu objeto RecyclerView.
fonte
RecyclerItemClickListener
não é uma classe android padrão, você deve fornecer a biblioteca que está usando ou a própria classe.Se você quiser o evento Click de reciclagem-Visualização da atividade / fragmento em vez do adaptador, você também pode usar o seguinte atalho.
Você também pode usar outras formas longas, como usar a interface
fonte
fonte
Use o código abaixo: -
fonte
O RecyclerView não fornece esse método.
Para gerenciar eventos de clique no RecyclerView acabei implementando onClickListener no meu adaptador, ao vincular o ViewHolder: No meu ViewHolder mantenho uma referência para a visão raiz (como você pode fazer com seus ImageViews, TextViews, etc ...) e ao vincular o viewHolder Eu defino uma tag nele com as informações que preciso para lidar com o clique (como posição) e um clicklistener
fonte
Eu também enfrentei o mesmo problema.
Eu queria encontrar a posição do item clicado / selecionado do RecyclerView () e realizar algumas operações específicas naquele item em particular.
O método getAdapterPosition () funciona perfeitamente para esse tipo de coisa. Descobri esse método depois de um dia de longa pesquisa e depois de tentar vários outros métodos.
Você não precisa usar nenhum método extra. Basta criar uma variável global chamada 'position' e inicializá-la com getAdapterPosition () em qualquer um dos métodos principais do adaptador (classe ou similar).
Aqui está uma breve documentação deste link .
Feliz por ajudar. Sinta-se à vontade para tirar dúvidas.
fonte
Minha solução simples
Basta posicionar ou inserir os dados que você precisa obter da atividade.
Construtor do adaptador:
Em atividade:
No adaptador onClickLictener no item
em onBindViewHolder
Agora, sempre que você muda de posição no RecyclerView, ela é mantida no Holder (ou talvez deva se chamar Listener)
Espero que seja útil
Minha primeira postagem; P
fonte
fonte
Tente desta forma
Classe do adaptador:
}
Em sua atividade ou fragmento:
Nota: Implemente o OnItemClickListener com base no contexto fornecido por você em atividade ou fragmento e métodos de substituição.
fonte
Toda vez que uso outra abordagem. As pessoas parecem armazenar ou obter posição em uma visualização, em vez de armazenar uma referência a um objeto que é exibido por ViewHolder.
Em vez disso, uso essa abordagem e apenas armazeno-a em ViewHolder quando onBindViewHolder () é chamado e defini a referência como null em onViewRecycled ().
Cada vez que o ViewHolder se torna invisível, ele é reciclado. Portanto, isso não afeta no grande consumo de memória.
fonte
A extensão curta para o Método Kotlin
retorna a posição absoluta de todos os itens (não a posição apenas de itens visíveis).
E uso
fonte
Use getLayoutPosition () em seu método java de interface personalizada. Isso retornará a posição selecionada de um item, verifique todos os detalhes em
https://becody.com/get-clicked-item-and-its-position-in-recyclerview/
fonte
No designer, você pode definir a
onClick
propriedade do listItem como um método definido com um único parâmetro. Eu tenho um método de exemplo definido abaixo. O método getAdapterPosition fornecerá o índice do listItem selecionado.Para obter informações sobre como configurar um RecyclerView, consulte a documentação aqui: https://developer.android.com/guide/topics/ui/layout/recyclerview
fonte
fonte
Depois de muita tentativa e erro, descobri que há uma maneira muito fácil de fazer isso que é criando uma interface na classe do adaptador e implementando isso no fragmento agora vem a reviravolta, instansiei o modelo de visualização dentro da minha função de substituição presente no fragmento agora você pode enviar os dados dessa função para viemodel e de lá em qualquer lugar.
Não sei se este método é um bom método de codificação, mas por favor, deixe-me saber em um comentário e se alguém quiser ver o deixe-me saber na seção de comentários, eu regularmente abro o fluxo de pilha.
fonte
Se usar Kotlin
fonte
Em onViewHolder, defina onClickListiner para qualquer visualização e, no clique lateral, use este código:
Toast.makeText (Drawer_bar.this, "posição" + posição, Toast.LENGTH_SHORT) .show ();
Substitua
Drawer_Bar
pelo nome da sua atividade.fonte