Estou tentando atualizar um item específico em RecyclerView
.
História: Sempre que o usuário clica no item, ele é exibido AlertDialog
. O usuário pode digitar algum texto clicando no botão ok. Quero mostrar este texto neste item e mostrar invisível ImageView
- declarado em XML e adaptador ViewHolder
-
Usei esta função no AlertDialog
Botão Positivo para atualizar o item:
private void updateListItem(int position) {
View view = layoutManager.findViewByPosition(position);
ImageView medicineSelected = (ImageView) view.findViewById(R.id.medicine_selected);
medicineSelected.setVisibility(View.VISIBLE);
TextView orderQuantity = (TextView) view.findViewById(R.id.order_quantity);
orderQuantity.setVisibility(View.VISIBLE);
orderQuantity.setText(quantity + " packet added!");
medicinesArrayAdapter.notifyItemChanged(position);
}
Mas este código não apenas altera o itemView na posição passada, mas também altera alguns dos outros itemView (s)!
Como devo alterar um itemView específico corretamente clicando nele?
onBindViewHolder()
Atualizar item único
notifyItemChanged(updateIndex)
Exemplo
Altere o item "Ovelha" para que diga "Eu gosto de ovelhas".
Minha resposta completa com mais exemplos está aqui .
fonte
Adicione o texto alterado à sua lista de dados do modelo
fonte
Acho que tenho uma ideia de como lidar com isso. Atualizar é o mesmo que excluir e recolocar na posição exata. Então, primeiro removo o item dessa posição usando o código abaixo:
e então eu adicionaria o item naquela posição específica, conforme mostrado abaixo:
Estou tentando implementar isso agora. Gostaria de lhe dar um feedback quando terminar!
fonte
Eu consegui resolver esse problema pegando a posição do item que precisava ser modificado e então na chamada do adaptador
, isso irá chamar onBindViewHolder (titular do ViewHolder, posição interna) para este item específico nesta posição específica.
fonte
A solução abaixo funcionou para mim:
Em um item RecyclerView, o usuário clica em um botão, mas outra visualização como TextView será atualizada sem notificar diretamente o adaptador:
Eu encontrei uma boa solução para isso sem usar o método notificationDataSetChanged (), este método recarrega todos os dados de recyclerView, então se você tiver imagem ou vídeo dentro do item, eles serão recarregados e a experiência do usuário não será boa:
Aqui está um exemplo de clique em um ícone semelhante a ImageView e atualizar apenas uma única TextView (possível atualizar mais visualização da mesma maneira do mesmo item) para mostrar como atualização de contagem após adicionar +1:
fonte
Uma maneira que funcionou para mim pessoalmente é usar os métodos do adaptador do recyclerview para lidar com as mudanças em seus itens.
Seria de uma forma semelhante a esta, criar um método na visualização do reciclador personalizado mais ou menos assim:
fonte
Em sua classe de adaptador, no método onBindViewHolder, defina ViewHolder como setIsRecyclable (false) como no código abaixo.
fonte
você só precisa adicionar o seguinte código na caixa de diálogo de alerta ao clicar em salvar
fonte
O problema é
RecyclerView.Adatper
que não fornece nenhum método que retorne o índice do elementoMinha solução alternativa é criar uma instância de mapa para (elemento, posição) s
Friend
) deve implementarhashCode()
eequals()
porque é a chave no hashmap.quando um elemento mudou,
É bom definir um método auxiliar
A instância do mapa (
Map<Friend, Integer> posMap
) não é necessariamente necessária. Se o mapa não for usado, o loop em toda a lista pode encontrar a posição de um elemento.fonte
Esse também é meu último problema. Aqui minha solução eu uso modelo de dados e adaptador para meu RecyclerView
fonte
se você está criando um objeto e adicionando-o à lista que você usa em seu adaptador, quando você muda um elemento de sua lista no adaptador, todos os seus outros itens mudam também em outras palavras, são apenas referências e sua lista não mantenha cópias separadas desse único objeto.
fonte
Em seu adaptador RecyclerView, você deve ter um ArrayList e também um método
addItemsToList(items)
para adicionar itens de lista ao ArrayList. Em seguida, você pode adicionar itens de lista por chamadaadapter.addItemsToList(items)
dinamicamente. Depois que todos os itens da sua lista forem adicionados ao ArrayList, você pode chamaradapter.notifyDataSetChanged()
para exibir sua lista.Você pode usar o
notifyDataSetChanged
no adaptador para o RecyclerViewfonte