web-dev-qa-db-fra.com

Meilleur moyen de réorganiser les éléments dans Android 4+ ListView

La réorganisation des éléments ListView est assez facile sur iOS. Maintenant, je voudrais faire la même chose sur Android mais cela semble être assez lourd: la réorganisation des articles n'est pas prise en charge par le SDK et il faut l'implémenter seul ou utiliser un troisième -mise en œuvre des parties.

J'ai trouvé plusieurs articles et publications traitant de cette question mais ils étaient tous assez anciens (2-3 ans). Par exemple, le bauerca DragSortListView est référencé à de nombreux endroits, mais le projet n'est plus maintenu. Étant donné que mon application devrait prendre en charge Android 4+ uniquement, je voulais demander si, en attendant, il y avait mieux à faire.

Bien sûr, la réorganisation par glisser-déposer serait le moyen le plus pratique pour l'utilisateur, mais je suis ouvert à toute solution qui fonctionne (par exemple, en utilisant un menu contextuel avec haut/bas)

Quelle est la meilleure façon de fournir une commande d'articles en Android 4 +?

Existe-t-il quelque chose comme une méthode par défaut/standard pour le faire?

36
Andrei Herford

Cette question est assez ancienne mais elle vient en premier lorsque vous recherchez la "meilleure façon de réorganiser les éléments de la liste dans Android" et elle est restée sans réponse.

L'OP a demandé ListView car au moment de la question, ils étaient les plus couramment utilisés. Aujourd'hui, il est préférable d'utiliser le RecyclerView car il offre de nombreux avantages par rapport au ListView. L'un de ces avantages est ce dont nous avons besoin pour mettre en œuvre la réorganisation, à savoir. ItemTouchHelper.

Pour voir comment le RecyclerView est implémenté, vous pouvez consulter cet exemple: https://github.com/googlesamples/Android-RecyclerView

La partie pour implémenter la réorganisation est d'attacher au RecyclerView comme suit:

mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recyclerView);

ItemTouchHelper touchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {

                Collections.swap(dataList, viewHolder.getAdapterPosition(), target.getAdapterPosition());
                mAdapter.notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
                return true;
            }

            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
                // no-op
            }

            @Override
            public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
                return makeFlag(ItemTouchHelper.ACTION_STATE_DRAG,
                        ItemTouchHelper.DOWN | ItemTouchHelper.UP | ItemTouchHelper.START | ItemTouchHelper.END);
            }
});
touchHelper.attachToRecyclerView(mRecyclerView);
3
113408