[Java] Notez comment utiliser RecyclerView et comment implémenter le traitement par balayage animé.

1.Tout d'abord

1.1 Refus

** Ce site relie certains articles de Qiita. Si vous trouvez cela désagréable, veuillez commenter. Nous correspondrons. ** **

1.2 Objet

RecyclerView est très pratique. Je l'utilise à la place de ListView '', mais j'oublierai comment l'implémenter et le glisser, donc je ferai une note ici. L'animation de balayage imite le balayage de suppression de courrier électronique Gmail ''.

2. Corps de RecyclerView

Cette implémentation est la même que "RecyclerView Basics" de @naoi. Il est expliqué d'une manière très facile à comprendre. Le mécanisme de RecyclerView est un peu compliqué, c'est donc une bonne idée de se souvenir de la figure.

Ici, nous allons produire les quatre suivants.

** Cette fois, mettons les données sous forme d'image et de chaîne de caractères. ** **

2.1 Déterminer la disposition d'une ligne (adapter_row.xml)

Déterminez la disposition d'une ligne de `` RecyclerView ''.

adapter_row


<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/imageView_adapter_show_bitmap"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/textView_adapter_show_string"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

</android.support.constraint.ConstraintLayout>

2.2 Créer une structure (DataModel.java)

Il n'y a pas de structure en Java, mais vous pouvez remplacer `` Classe ''.

DataModel.java



public class DataModel {
    private Bitmap mBitmap;
    private String mString;

    public Bitmap getBitmap () {
        return mBitmap;
    }

    public String getString () {
        return mString;
    }

    public void setBitmap (Bitmap mBitmap) {
        this.mBitmap = mBitmap;
    }

    public void setString (String mString) {
        this.mString = mString;
    }
}

N'est-il pas courant d'ajouter `` m '' aux variables membres?

En passant, on dit que "get ~" et "set ~" sont `getter / setter```, mais dans` `ʻAndroid Studio, si vous tapez jusqu'à public , la variable membre Il semble faire `` getter / setter ''. Je suis reconnaissant que si je change un peu le nom, il est complet.

2.3 Obtenir la vue en une seule ligne (ViewHolder.java)

Créez un ViewHolder ''. Ici, le corps xmln'est pas spécifié, mais View '' sur une ligne est `` findViewByID () ''.

ViewHolder.java



public class ViewHolder extends RecyclerView.ViewHolder {
    public ImageView mImageView;
    public TextView mTextView;
    
    //constructeur
    public ViewHolder (@NonNull View itemView) {
        super(itemView);
        mImageView = itemView.findViewById(R.id.imageView_adapter_show_bitmap);
        mTextView = itemView.findViewById(R.id.textView_adapter_show_string);
    }
}

Lorsque le constructeur hérite de RecyclerView.ViewHolder, il est nécessaire d'ajouter ```itemView`` à l'argument.

2.4 Placer les données (Adapter.java)

Adapter.java



public class Adapter extends RecyclerView.Adapter<ViewHolder> {

    private List<DataModel> insertDataList;

    public Adapter (List<DataModel> list) {
        this.insertDataList = list;
    }

    @NonNull
    @Override
    public NoteViewHolder onCreateViewHolder (@NonNull ViewGroup viewGroup, int i) {
        View inflate = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.adapter_row, viewGroup, false);
        return new ViewHolder(inflate);
    }

    @Override
    public void onBindViewHolder (@NonNull ViewHolder viewHolder, int i) {
        noteViewHolder.mImageView.setImageBitmap(insertDataList.get(i).getBitmap());
        noteViewHolder.mTextView.setText(insertDataList.get(i).getString());
    }

    @Override
    public int getItemCount () {
        return insertDataList.size();
    }
}

3. Comment utiliser

L'utilisation dans `ʻActivity`` etc. est la suivante. ** L'adaptateur peut entrer en conflit avec d'autres ... (je lui donne en fait un nom différent) **

MainActivity.java


public class RegisterNoteActivity extends AppCompatActivity {
    RecyclerView mRecyclerViewList;

    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mRecyclerViewList = findViewById(R.id.recyclerView_main);

        LinearLayoutManager manager = new LinearLayoutManager(this);
        mRecyclerViewList.setHasFixedSize(false);
        mRecyclerViewList.setLayoutManager(manager);
        mRecyclerViewList.setAdapter(new Adapter(createData()));
    }

    private List<NoteDataModel> createData() {
        List<NoteDataModel> list = new ArrayList<>();
        for (int index = 0; index < 100; index++) {
            //Une ligne de données
            NoteDataModel rowData = new NoteDataModel();
            rowData.setBitmap(/*Une image*/);
            rowData.setmString("Cette ligne est" + (index + 1) + "C'est la deuxième répétition.");
            list.add(rowData);
        }
        return list;
    }
}

4. Balayez

Implémentons un balayage animé. Pour dire la vérité, lorsque vous implémentez le balayage, ** il est accompagné d'une animation qui se déplace latéralement ou s'éloigne. ** Les couleurs et les icônes ne l'accompagnent pas, vous pouvez donc l'implémenter ici. Cette fois, ** supprimer uniquement en balayant vers la gauche **. La couleur est rouge et l'icône est ** votre propre ** poubelle.

MainActivity.java


    // ...réduction
    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register_note);
        // ...réduction...
        mRecyclerViewList.setAdapter(new Adapter(createData())); //Il y a un instant
        //Ajouter à partir d'ici
        final Drawable deleteIcon = ContextCompat.getDrawable(this, R.drawable.ic_action_delete);
        ItemTouchHelper.SimpleCallback callback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {

            @Override
            public boolean onMove (@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) {
                return false;
            }

            @Override
            public void onSwiped (@NonNull RecyclerView.ViewHolder viewHolder, int i) {
                int swipedPosition = viewHolder.getAdapterPosition();
                Adapter adapter = (Adapter) mRecyclerView.getAdapter();
                //Si vous souhaitez vous inscrire, voici le processus pour le supprimer de la liste
                //Avisez qu'il a été supprimé et reflétez-le.
                adapter.notifyItemRemoved(swipedPosition);
            }

            @Override
            public void onChildDraw (@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
                super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
                View itemView = viewHolder.itemView;

                //En cas d'annulation
                if (dX == 0f && !isCurrentlyActive) {
                    clearCanvas(c, itemView.getRight() + (int) dX, itemView.getTop(), itemView.getRight(), itemView.getBottom());
                    super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, false);
                    return;
                }

                ColorDrawable background = new ColorDrawable();
                background .setColor(Color.parseColor("#f44336"));
                background.setBounds(itemView.getRight() + (int)dX, itemView.getTop(),  itemView.getRight(), itemView.getBottom());
                background.draw(c);

                int deleteIconTop = itemView.getTop() + (itemView.getHeight() - deleteIcon.getIntrinsicHeight()) / 2;
                int deleteIconMargin = (itemView.getHeight() - deleteIcon.getIntrinsicHeight()) / 2;
                int deleteIconLeft = itemView.getRight() - deleteIconMargin - deleteIcon.getIntrinsicWidth();
                int deleteIconRight = itemView.getRight() - deleteIconMargin;
                int deleteIconBottom = deleteIconTop +  deleteIcon.getIntrinsicHeight();

                deleteIcon.setBounds(deleteIconLeft, deleteIconTop, deleteIconRight, deleteIconBottom);
                deleteIcon.draw(c);
            }
        };
        new ItemTouchHelper(callback).attachToRecyclerView(mRecyclerView);

    }

    private void clearCanvas(Canvas c, int left, int top, int right, int bottom) {
        Paint paint = new Paint();
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
        c.drawRect(left, top, right, bottom, paint);
    }
    //réduction...

Les images d'icônes, les calculs, les codes de couleur et les idées de traitement sont "Balayez pour supprimer la liste Android # Comment faites-vous cela?" Par @ shts Et à partir de ce Github. Je suis désolé sans permission.

C'est «onSwiped» qui se déclenche lorsque le balayage est terminé, mais même si vous l'annulez, «onChildDraw» est appelé à chaque image sur le chemin. Il semble que «onMove» est pour quand le glisser-déposer est également autorisé, mais dois-je retourner «false»?

En outre, il semble que vous puissiez autoriser à la fois le balayage vers la droite et le balayage vers la gauche comme suit.

        ItemTouchHelper.SimpleCallback callback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {

            @Override
            public boolean onMove (@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) {
                return false;
            }

            @Override
            public void onSwiped (@NonNull RecyclerView.ViewHolder viewHolder, int i) {
                
            }

            @Override
            public void onChildDraw (@NonNull Canvas c, @NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
                super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
                if (dX < 0) {
                    //En balayant vers la gauche
                } else {
                    //En balayant vers la droite
                }
            }
        };

Il est caché et vous ne pouvez pas le voir au premier coup d'œil, mais soyez prudent car il dit ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT à la fin de la première ligne. ʻOnChildDraw`` est comme ci-dessus, mais je ne sais pas comment diviser le traitement en ʻonSwiped``. (Utilisez-vous «i»?)

5. Résumé

Tout d'abord, merci aux affiches du site pour votre référence. C'est un peu difficile, mais je vais vous le présenter ici.

Principes de base de RecyclerView J'ai essayé d'imiter le RecyclerView lui-même presque de la même manière.

Suppression du déplacement et du glissement par glisser-déposer dans RecyclerView J'ai l'image d'un coup.

Faites glisser pour supprimer la liste Android # Que faites-vous? J'ai réécrit le processus de balayage en Java. → L'image et le traitement détaillé proviennent du [GitHub] joint (https://github.com/shts/SwipeToDismissSample).

Remarque sur la façon de supprimer un élément avec un balayage horizontal en utilisant RecyclerView sur Android J'ai mentionné comment mettre à jour l'adaptateur en Java.

Comment supprimer des éléments dans RecyclerView en les faisant glisser J'ai évoqué le traitement supplémentaire en dehors de la poste.

Merci tout le monde. Je suis désolé de ne pouvoir créer un traitement qu'en enveloppant le code d'autres personnes de cette manière, mais c'est pourquoi j'espère profiter à quelqu'un.

Twitter: https://twitter.com/Cyber_Hacnosuke (Veuillez me suivre.) Veuillez l'aimer aussi.

Recommended Posts

[Java] Notez comment utiliser RecyclerView et comment implémenter le traitement par balayage animé.
[Traitement × Java] Comment utiliser les tableaux
[Traitement × Java] Comment utiliser la boucle
[Java] [Maven3] Résumé de l'utilisation de Maven3
[Traitement × Java] Comment utiliser la classe
Comment utiliser la classe Java Scanner (Remarque)
[Traitement × Java] Comment utiliser la fonction
[Java] Comment utiliser la classe FileReader et la classe BufferedReader
Comment utiliser le contrôle segmenté et les points à noter
Comment utiliser la portée et le traitement des passes (servist)
[Java] Comment utiliser la classe Calendar et la classe Date
Résumé de l'API de communication Java (1) Comment utiliser Socket
Résumé de l'API de communication Java (3) Comment utiliser SocketChannel
Résumé de l'API de communication Java (2) Comment utiliser HttpUrlConnection
Comment utiliser java Facultatif
Comment utiliser la classe Java
[Java] Comment utiliser removeAll ()
Comment utiliser Java Map
Comment utiliser les variables Java
Comment utiliser le modèle entraîné Tensorflow 2.0 avec Kotlin / Java
[Traitement × Java] Comment utiliser la boucle 2 --- structure imbriquée, conversion de coordonnées
Comment appeler et utiliser l'API en Java (Spring Boot)
Comment utiliser StringBurrer et Arrays.toString.
Comment utiliser HttpClient de Java (Get)
[Rails] Comment utiliser l'appareil (Remarque)
Comment utiliser EventBus3 et ThreadMode
Comment utiliser HttpClient de Java (Post)
[Java] Comment utiliser la méthode de jointure
Comment utiliser l'égalité et l'égalité (comment utiliser l'égalité)
Comment utiliser setDefaultCloseOperation () de JFrame
[JavaFX] [Java8] Comment utiliser GridPane
Comment utiliser les méthodes de classe [Java]
[Java] Comment utiliser List [ArrayList]
Comment utiliser les classes en Java?
Comment utiliser les expressions Java lambda
[Java] Comment utiliser la classe Math
Comment utiliser le type enum Java
Bases du développement Java ~ Comment écrire des programmes (variables et types) ~
[Java] Comment utiliser les modificateurs statiques (Que sont l'importation statique finale et statique)
Comment écrire un exemple d'implémentation Java d'un problème F01 en temps réel hors ligne
Prise en charge multilingue de Java Comment utiliser les paramètres régionaux
[Java] Comment utiliser la classe File
[java] Résumé de la gestion des caractères
Comment utiliser la méthode de soumission (Java Silver)
[Explication facile à comprendre! ] Comment utiliser l'instance Java
[Java] Comment utiliser la méthode toString ()
Implémentation Java pour créer et résoudre des labyrinthes
[Java] Comment sortir et écrire des fichiers!
Comment configurer et utiliser kapt
Comment utiliser et définir les classes Java, importer
[Note] Comment utiliser Rails 6 Devise + cancancan
[Explication facile à comprendre! ] Comment utiliser ArrayList [Java]
Comment utiliser les méthodes substring et substr
[Java] Comment utiliser la classe Calendar