Eu tenho uma lista de registros em uma exibição de lista que desejo que o usuário possa classificar novamente usando um método de arrastar e soltar. Eu já vi isso implementado em outros aplicativos, mas não encontrei um tutorial para isso. Deve ser algo que os outros também precisam. Alguém pode me indicar algum código para fazer isso?
132
Respostas:
Estou trabalhando nisso há algum tempo. Difícil de acertar, e não afirmo que sim, mas estou feliz com isso até agora. Meu código e várias demos podem ser encontrados em
Seu uso é muito semelhante ao TouchInterceptor (no qual o código se baseia), embora tenham sido feitas alterações significativas na implementação.
O DragSortListView possui rolagem suave e previsível ao arrastar e embaralhar itens. As aleatórias de itens são muito mais consistentes com a posição do item de arrastar / flutuar. Os itens da lista de altura heterogênea são suportados. A rolagem por arraste é personalizável (eu demonstro uma rolagem rápida por uma longa lista - não que um aplicativo venha à mente). Cabeçalhos / rodapés são respeitados. etc. ?? Dê uma olhada.
fonte
Agora é muito fácil de implementar
RecyclerView
com o ItemTouchHelper . Basta substituir oonMove
método deItemTouchHelper.Callback
:Um tutorial muito bom sobre isso pode ser encontrado em medium.com: Arrastar e deslizar com o RecyclerView
fonte
Estou adicionando esta resposta com a finalidade de quem pesquisar sobre isso ..
Houve recentemente um episódio de DevBytes ( arrastar e reorganizar uma célula ListView ) que explica como fazer isso
Você pode encontrá-lo aqui também, o código de exemplo está disponível aqui .
O que esse código basicamente faz é que ele cria um
dynamic listview
pela extensãolistview
que suporta o arrastamento e troca de células. Para que você possa usar o emDynamicListView
vez do básicoListView
e é isso, você implementou um ListView com Arrastar e Soltar.fonte
A biblioteca do DragListView faz isso muito legal, com um suporte muito bom para animações personalizadas, como animações de elevação. Também é mantido e atualizado regularmente.
Aqui está como você o usa:
1: Adicione a lib para classificar primeiro
2: Adicionar lista do xml
3: Defina o ouvinte de arrastar
4: Crie um adaptador substituído no DragItemAdapter
5: Implementar um viewholder que se estenda de DragItemAdapter.ViewHolder
Para informações mais detalhadas, acesse https://github.com/woxblom/DragListView
fonte
Descobri que o DragSortListView funcionava bem, embora a introdução dele pudesse ter sido mais fácil. Aqui está um breve tutorial sobre como usá-lo no Android Studio com uma lista na memória:
Adicione isso às
build.gradle
dependências do seu aplicativo:Crie um recurso para o ID da alça de arrasto criando ou adicionando a
values/ids.xml
:Crie um layout para um item da lista que inclua sua imagem favorita da alça de arrasto e atribua seu ID ao ID que você criou na etapa 2 (por exemplo
drag_handle
).Crie um layout DragSortListView, algo como isto:
Defina uma
ArrayAdapter
derivada com umagetView
substituição que renderize a exibição do item de lista.Defina um listener de recebimento que reorganize os itens conforme eles são descartados.
fonte
Recentemente, deparei-me com este excelente Gist que fornece uma implementação funcional de uma classificação por arraste
ListView
, sem dependências externas necessárias.Basicamente, ele consiste em criar seu Adaptador customizado estendendo-se
ArrayAdapter
como uma classe interna para a atividade que contém o seuListView
. Nesse adaptador, um define umonTouchListener
para seus Itens da lista que sinalizará o início do arrasto.Nesse Gist, eles definem o ouvinte para uma parte específica do layout do Item da lista (o "identificador" do item), para que não seja movido acidentalmente pressionando qualquer parte dele. Pessoalmente, preferi optar por um
onLongClickListener
, mas isso depende de você decidir. Aqui um trecho dessa parte:Isso também envolve adicionar um
onTouchListener
aoListView
, que verifica se um item está sendo arrastado, manipula a troca e a invalidação e interrompe o estado do arrasto. Um trecho dessa parte:Por fim, eis a aparência dos métodos
stopDrag
estartDrag
, que tratam da ativação e desativação do processo de arrastar:fonte