Alguém usando RecyclerView
encontrou uma maneira de definir um onClickListener
para itens no RecyclerView
? Pensei em definir um ouvinte para cada um dos layouts de cada item, mas isso parece um pouco complicado demais. Tenho certeza de que existe uma maneira de RecyclerView
ouvir o onClick
evento, mas não consigo entender direito.
java
android
android-recyclerview
onclick
onclicklistener
CurtJRees
fonte
fonte
Respostas:
Como as APIs mudaram radicalmente, não me surpreenderia se você criasse um
OnClickListener
para cada item. Não é tão complicado assim. Na sua implementação deRecyclerView.Adapter<MyViewHolder>
, você deve ter:O
onClick
método:fonte
onClick()
, pertencente a,OnClickListener
pode ser anexado a QUALQUER visualização. A questão toda aqui é qual! Faça um esforço, um método não é apenas identificado por um nome, mas também pelo menos por uma classe. Se você não diz que seu código deve ser adicionado ao adaptador, sua resposta realmente não ajuda.Aqui está uma maneira melhor e menos acoplada de implementar um
OnClickListener
para aRecyclerView
.Snippet de uso:
RecyclerItemClickListener
implementação:fonte
Faço-o desta maneira, sem classes, detectores indevidos, etc. Código simples dentro do nosso adaptador. Solução especialmente melhor por longClick do que a apresentada anteriormente.
Em seguida, dentro do fragmento ou atividade, basta pressionar:
fonte
Confira uma pergunta semelhante no link do comentário do @ CommonsWare para isso , que implementa a
OnClickListener
interface noviewHolder
.Aqui está um exemplo simples do
ViewHolder
:O
Adapter
então se parece com isso:fonte
ListView
já era problemático se você tivesse que criar uma lista de objetos mais complicado do que linhas apenas simples. E se você precisar manipular eventos diferentes, dependendo de onde você clica no item no ListView? Você está ferrado. Aqui, você tem cada ouvinte.getPosition()
está obsoleto, usegetAdapterPosition()
ougetLayoutPosition()
substitua.Com base na resposta de Jacob Tabak (+1 para ele), consegui adicionar o ouvinte no LongClick:
Então você pode usá-lo assim:
fonte
public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){}
view.getId() == R.id.selection
Isto é o que funcionou para mim. Anexe o
OnClickListener
aoonBindView
. Realmente não sei se isso afetará o desempenho, mas parece funcionar bem com pouco código.fonte
Foi tão difícil para mim ter no ouvinte de clique do item na atividade e também ter ouvinte de clique para exibição única do item que não será acionado no ouvinte de clique do item. Depois de brincar com a resposta de Jacob Tabak, eu respeito a resposta dele no clique do item, se nenhuma outra ação de toque dentro do item for apresentada.
Eu tenho uma
OnClickListener
interface personalizada que possui um evento de clique no item que mantém a exibição do item clicado e a posição do item no adaptador. Apresento uma instância dela no construtor (ou pode ser com setter) e a anexo ao ouvinte de clique em contêiner do detentor da visualização.Também tenho outro ouvinte de clique no adaptador (pode estar no suporte da exibição) que manipulará o clique atual da exibição no contêiner.
Na atividade, você precisa inicializar o adaptador passando a instância do
OnItemClickListener
E meu ViewHolder
fonte
Acabei precisando disso, caso alguém ache útil:
Fonte: http://blog.csdn.net/jwzhangjie/article/details/36868515
fonte
Eu tenho a solução agradável para
RecyclerView
'sonItemClickListener
para os itens e subitensEtapa 1- Crie uma interface
Etapa 2- Em seguida, use-o no
onBindViewHolder
método do adaptador da seguinte maneiraEtapa 3- encontre e configure a visualização do reciclador na atividade ou fragmento em que você está usando este
Etapa 4- Finalmente implemente a interface na atividade ou fragmento em que você está usando a visão de reciclagem
fonte
Aqui está o que eu fiz. Esta solução suporta onClick e onLongClick nos itens e visualizações do RecyclerView, dentro dos itens do RecyclerView (visualizações internas).
Eu codifico viewHolder nas visualizações de minha escolha:
E eu uso holder.getPosition () para recuperar a posição no método onClick () (onLongClick é semelhante):
Uma variante com getChildPosition também funciona. Observe que, para as visualizações internas, em onClick () use:
Na minha opinião, a vantagem dessa solução é que, quando alguém clica na imagem, apenas o ouvinte da imagem onclick () é chamado, enquanto que quando eu combinei a solução de Jacob para uma visualização do Item RecyclerView e minha solução para visualizações internas na visualização do item RecyclerView onclick ( ) também é chamado (quando clicar na imagem).
fonte
Existe uma maneira muito mais fácil de fazer isso. Basta aplicar ao clicar na
onBindViewHolder
visualização raiz.Considere que esta é sua visão para o adaptador,
Em seguida, faça o seguinte no seu adaptador
fonte
Você pode passar um
clickListener
paraAdapter
.No seu
Activity
:depois passe para
Adapter
:In
Adapter
'sonCreateViewHolder
:fonte
holder
valores através da intenção?Eu desenvolvi uma biblioteca leve para android, você pode visitar https://github.com/ChathuraHettiarachchi/RecycleClick
e siga para a amostra a seguir
fonte
Você pode implementar OnClickListener na sua classe ViewHolder
E onBindViewHolder define o item do seu detentor da visualização
fonte
Muito simples e eficaz.
Em vez de implementar uma interface
View.OnClickListener
dentro do view view ou criar uma interface e implementar uma interface em sua atividade - usei esse código para simplificar aOnClickListener
implementação.fonte
Todas as respostas postadas até o momento são ótimas soluções; no entanto, se você não deseja lidar com muitos detalhes de implementação e deseja que ele funcione de maneira semelhante à do ListView, eu recomendaria o uso do TwoWay-View, como visto aqui:
https://github.com/lucasr/twoway-view
Observe que esta implementação também suporta pressão prolongada nos itens, bem como suporte para estados pressionados (o que é algo importante que falta a outras soluções para essa pergunta).
Se você não quiser usar a biblioteca inteira, consulte a classe ClickItemTouchListener , que pode ser usada como autônoma, se necessário. O único problema que encontrei com ele no momento é com pressão prolongada + rolagem, parece ter um comportamento incorreto.
fonte
Se você deseja capturar os eventos de clique em Itens individuais, basta implementar
OnClickListener
naViewHolder
classe e definir ouvintes de clique em visualizações individuais ou inteirasitemView
.O exemplo a seguir mostra o mesmo
fonte
Para mim, esta é a melhor maneira:
fonte
O
RecyclerView
não tem umOnClickListener
e terá que implementá-lo nós mesmos.Eu gosto de adicionar uma
OnItemClickListener
interfaceAdapter
com umonClick
método chamado quando você clica na exibição do item noViewHolder
. Portanto, a responsabilidade de gerenciar o clique em um item fica fora doViewHolder
eAdapter
. A atividade ou fragmento que decidirá o que fazerAdicione uma interface ao ouvinte e ao objeto do ouvinte.
Capturamos o clique da visualização raiz do item e, quando o retorno de chamada é acionado, o
onClick
ouvinte chama o adaptador.Como a atividade ou fragmento, fragmento no nosso caso, atribuímos um ouvinte ao adaptador e ao retorno de chamada onClick, obteremos o item selecionado por posição e abrimos uma atividade detalhada do item.
fonte
Infelizmente,
RecyclerView
faltam alguns recursosListView
incorporados. Por exemplo, a capacidade de adicionar umOnItemClickListener
que dispara quando um item é clicado.RecyclerView
permite que você defina umOnClickListener
no seu adaptador, mas passar o ouvinte de clique do seu código de chamada, para o adaptador e para oViewHolder
, é complicado para capturar um simples clique no item.Você também precisa definir
R.id.item_click_support
usando ids.xml:O ouvinte de clique no código resultante agora se parece com o seguinte:
Para uma breve explicação sobre cliques na visualização de reciclagem, consulte este littlerobots_blog
fonte
você pode definir facilmente setOnClickListener na sua classe ViewHolder da seguinte maneira:
fonte
Aqui está o que eu fiz Leia mais e faça o download da essência aqui
Adicionando o mesmo aqui
CustomItemClickListener.java
ItemsListAdapter.java
fonte
Da maioria das respostas acima, eles parecem estar definindo seus ouvintes de um clique para itens individuais. No entanto, a solução que estou prestes a oferecer é muito simples, mas ainda não é intuitiva para muitos. Muitos estão esquecendo que os outros componentes estão sempre em um componente pai, usado para exibir itens nas visualizações Lista ou Reciclador. Essa solução consiste em definir um único ouvinte de onclick para essa visualização principal e a vez é executada. A solução também inclui uma maneira de passar a posição do item que está sendo clicado na exibição em lista ou recicladora. Aqui, nosso rootview principal é um CardView da biblioteca de suporte do Android. Aqui está o código de exemplo
fonte
Implementação de Kotlin da resposta de nhaarman :
RecyclerItemClickListener.java:
fonte
fonte
fonte
Podemos fazer isso usando referências fracas do Java. Semanticamente, o detentor da exibição é aquele que deve responder ao evento click ou delegá-lo ao respondente correto.
Nossos objetivos:
Passos:
Crie uma interface para lidar com respostas de clique.
Implemente essa interface na Atividade que manipulará o clique.
Adicione uma variável de membro no RecyclerView Adapter para armazenar a Weak Reference e um construtor que a define.
Faça o mesmo no RecyclerView ViewHolder e adicione uma variável de membro para acompanhar a posição.
Defina seus ouvintes com um clique em qualquer visualização que desejar no ViewHolder e, em seguida, retorne a chamada para o respondente para lidar com eles.
Altere seu método onBindViewHolder para definir a posição ao vincular.
Passe o atendedor para o ViewHolder.
No respondedor, agora você pode usar getId () na exibição para descobrir em qual exibição foi clicada.
E aqui está um Gist para que você possa ver como tudo se encaixa: RecyclerView manipulação de cliques
fonte
Estou ciente de que há muitas respostas, mas achei que também poderia fornecer minha implementação. (Detalhes completos podem ser encontrados em outra pergunta que eu respondi ).
Portanto, para adicionar um ouvinte de clique, sua
ViewHolder
classe interna precisa implementarView.OnClickListener
. Isso ocorre porque você definirá umOnClickListener
para oitemView
parâmetro doViewHolder
construtor do. Deixe-me mostrar o que eu quero dizer:As únicas outras coisas que você precisa adicionar são uma interface personalizada para você
Adapter
e um método setter:Portanto, seu novo suporte a cliques
Adapter
está completo.Agora, vamos usá-lo ...
É basicamente como você configuraria um normal
Adapter
, exceto pelo uso do método setter criado para controlar o que você fará quando o usuário clicar em um item específico da lista.Você também pode ver um conjunto de exemplos que fiz neste Gist no GitHub:
https://gist.github.com/FarbodSalamat-Zadeh/7646564f48ee708c1582c013e1de4f07
fonte
Isto é o que eu faço para reutilizar
OnClickListener
no ViewHoder Pegue o pai do itemlayout
no onBindViewHolder definir tag como posição
e no Onclick
fonte
Para mim, a maneira limpa de fazer isso é essa.
Construtor do adaptador
A interface vinculada
fonte