[Java] Beachten Sie, wie Sie RecyclerView verwenden und die animierte Swipe-Verarbeitung implementieren.

1. Zuallererst

1.1 Ablehnung

** Diese Seite verlinkt einige Beiträge in Qiita. Wenn Sie es unangenehm finden, kommentieren Sie bitte. Wir werden korrespondieren. ** ** **

1.2 Zweck

RecyclerView ist sehr praktisch. Ich verwende es anstelle von "ListView", aber ich werde vergessen, wie man es implementiert und wischt, also mache ich hier eine Notiz. Die Swipe-Animation ahmt den "Google Mail" -E-Mail-Lösch-Swipe nach.

2. RecyclerView-Körper

Diese Implementierung entspricht [RecyclerView Basics "von @ naoi. Es wird sehr leicht verständlich erklärt. Der Mechanismus von "RecyclerView" ist etwas kompliziert, daher ist es eine gute Idee, sich an die Figur zu erinnern.

Hier werden wir die folgenden vier produzieren.

** Dieses Mal setzen wir die Daten als Bild und Zeichenkette. ** ** **

2.1 Bestimmen Sie das Layout einer Zeile (adapter_row.xml)

Bestimmen Sie das Layout einer Zeile von "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 Erstellen Sie eine Struktur (DataModel.java)

In Java gibt es keine Struktur, aber Sie können "Klasse" ersetzen.

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;
    }
}

Ist es nicht üblich, Mitgliedsvariablen m hinzuzufügen?

Abgesehen davon werden "get ~" und "set ~" als "getter / setter" bezeichnet, aber in "AndroidStudio", wenn Sie "public" drücken, die Mitgliedsvariable " Es scheint "Getter / Setter" zu machen. Ich bin dankbar, dass wenn ich den Namen ein wenig ändere, er vollständig ist.

2.3 Ansicht in einer Zeile abrufen (ViewHolder.java)

Erstellen Sie einen ViewHolder. Hier ist xml body nicht angegeben, aber View in einer Zeile ist findViewByID ().

ViewHolder.java



public class ViewHolder extends RecyclerView.ViewHolder {
    public ImageView mImageView;
    public TextView mTextView;
    
    //Konstrukteur
    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);
    }
}

Wenn der Konstruktor "RecyclerView.ViewHolder" erbt, muss dem Argument "itemView" hinzugefügt werden.

2.4 Daten platzieren (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. Verwendung

Die Verwendung in "Aktivität" usw. ist wie folgt. ** Adapter kann mit anderen in Konflikt stehen ... (Ich gebe ihm tatsächlich einen anderen Namen) **

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++) {
            //Eine Datenzeile
            NoteDataModel rowData = new NoteDataModel();
            rowData.setBitmap(/*Ein Bild*/);
            rowData.setmString("Diese Zeile ist" + (index + 1) + "Dies ist die zweite Wiederholung.");
            list.add(rowData);
        }
        return list;
    }
}

4. Streichen

Lassen Sie uns einen animierten Swipe implementieren. Um ehrlich zu sein, wenn Sie Swipe implementieren, ** wird eine Animation mitgeliefert, die sich seitwärts verschiebt oder wegschnappt. ** Farben und Symbole werden nicht mitgeliefert, daher können Sie sie hier implementieren. Dieses Mal ** nur löschen, wenn Sie nach links wischen **. Die Farbe ist rot und das Symbol ist ** Ihr eigener ** Mülleimer.

MainActivity.java


    // ...Kürzung
    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register_note);
        // ...Kürzung...
        mRecyclerViewList.setAdapter(new Adapter(createData())); //Kuerzlich
        //Von hier aus hinzufügen
        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();
                //Wenn Sie sich registrieren möchten, finden Sie hier den Vorgang zum Löschen aus der Liste
                //Benachrichtigen Sie, dass es gelöscht wurde, und spiegeln Sie es wider.
                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;

                //Bei Stornierung
                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);
    }
    //Kürzung...

Symbolbilder, Berechnungen, Farbcodes und Verarbeitungsideen sind "Streichen Sie, um die Android-Liste zu löschen # Was machen Sie?" Von @ shts Und von diesem Github. Es tut mir leid ohne Erlaubnis.

Es ist "onSwiped", das ausgelöst wird, wenn das Wischen abgeschlossen ist, aber selbst wenn Sie es abbrechen, wird "onChildDraw" jedes Frame auf dem Weg aufgerufen. Es scheint, dass "onMove" für den Fall ist, dass Drag & Drop ebenfalls zulässig ist, aber sollte ich "false" zurückgeben?

Als zusätzliche Anmerkung scheint es, dass Sie sowohl das Wischen nach rechts als auch nach links wie folgt zulassen können.

        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) {
                    //Beim Wischen nach links
                } else {
                    //Beim Wischen nach rechts
                }
            }
        };

Es ist versteckt und kann auf den ersten Blick nicht angezeigt werden. Seien Sie jedoch vorsichtig, da am Ende der ersten Zeile "ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT" steht. onChildDraw ist wie oben, aber ich weiß nicht, wie ich die Verarbeitung in onSwiped aufteilen soll. (Benutzt du i?)

5. Zusammenfassung

Zunächst einmal vielen Dank an die Poster der Website für Ihre Referenz. Es ist etwas rau, aber ich werde es hier vorstellen.

Grundlagen von RecyclerView Ich habe versucht, das RecyclerView selbst auf fast die gleiche Weise zu imitieren.

Ziehen und Ablegen per Drag & Drop in RecyclerView Ich habe das Bild eines Schlages.

Wischen Sie, um die Android-Liste zu löschen. # Was machen Sie? Ich habe den Swipe-Prozess in Java umgeschrieben. → Das Bild und die detaillierte Verarbeitung stammen aus dem angehängten GitHub.

Hinweis zum Entfernen von Elementen mit einem horizontalen Wisch mithilfe von RecyclerView unter Android Ich habe darauf hingewiesen, wie der Adapter in Java aktualisiert wird.

Löschen von Elementen in RecyclerView durch Wischen Ich habe auf die zusätzliche Bearbeitung außerhalb der Post verwiesen.

Vielen Dank an alle. Es tut mir leid, dass ich nur dann eine Verarbeitung erstellen kann, wenn ich den Code anderer Leute auf diese Weise umhülle, aber deshalb hoffe ich, jemandem zu helfen.

Twitter: https://twitter.com/Cyber_Hacnosuke (Bitte folgen Sie mir.) Bitte mag es auch.

Recommended Posts

[Java] Beachten Sie, wie Sie RecyclerView verwenden und die animierte Swipe-Verarbeitung implementieren.
[Verarbeitung × Java] Verwendung von Arrays
[Verarbeitung × Java] Verwendung der Schleife
[Java] [Maven3] Zusammenfassung der Verwendung von Maven3
[Verarbeitung × Java] Verwendung der Klasse
Verwendung der Java Scanner-Klasse (Hinweis)
[Verarbeitung × Java] Verwendung der Funktion
[Java] Verwendung der FileReader-Klasse und der BufferedReader-Klasse
Verwendung von Segmented Control und zu notierenden Punkten
Verwendung der Scope- und Pass-Verarbeitung (Servist)
[Java] Verwendung der Kalenderklasse und der Datumsklasse
Zusammenfassung der Java-Kommunikations-API (1) Verwendung von Socket
Zusammenfassung der Java-Kommunikations-API (3) Verwendung von SocketChannel
Zusammenfassung der Java-Kommunikations-API (2) Verwendung von HttpUrlConnection
Verwendung von Java Optional
Verwendung der Java-Klasse
[Java] Verwendung von removeAll ()
Verwendung von Java Map
Verwendung von Java-Variablen
Verwendung des mit Tensorflow 2.0 trainierten Modells mit Kotlin / Java
[Verarbeitung × Java] Verwendung von Schleife 2 --- verschachtelte Struktur, Koordinatenkonvertierung
Aufrufen und Verwenden der API in Java (Spring Boot)
Verwendung von StringBurrer und Arrays.toString.
Verwendung von HttpClient (Get) von Java
[Schienen] Verwendung von Geräten (Hinweis)
Verwendung von EventBus3 und ThreadMode
Verwendung von HttpClient (Post) von Java
[Java] Verwendung der Join-Methode
Wie man Gleichheit und Gleichheit benutzt (wie man Gleichheit benutzt)
Verwendung von setDefaultCloseOperation () von JFrame
[JavaFX] [Java8] Verwendung von GridPane
Verwendung von Klassenmethoden [Java]
[Java] Verwendung von List [ArrayList]
Wie verwende ich Klassen in Java?
Verwendung von Java-Lambda-Ausdrücken
[Java] Verwendung der Math-Klasse
Verwendung des Java-Aufzählungstyps
Grundlagen der Java-Entwicklung ~ Schreiben von Programmen (Variablen und Typen) ~
[Java] Verwendung statischer Modifikatoren (Was sind statische endgültige und statische Importe)
Offline in Echtzeit, wie man ein Java-Implementierungsbeispiel für ein F01-Problem schreibt
Mehrsprachige Unterstützung für Java Verwendung des Gebietsschemas
[Java] Verwendung der File-Klasse
[java] Zusammenfassung des Umgangs mit char
Verwendung der Submit-Methode (Java Silver)
[Leicht verständliche Erklärung! ] Verwendung der Java-Instanz
[Java] Verwendung der toString () -Methode
Java-Implementierung zum Erstellen und Lösen von Labyrinthen
[Java] Wie man Dateien ausgibt und schreibt!
So richten Sie kapt ein und verwenden es
Verwendung und Definition von Java-Klassen, Importieren
[Hinweis] Verwendung von Rails 6 Devise + Cancancan
[Leicht verständliche Erklärung! ] Verwendung von ArrayList [Java]
Verwendung von Teilzeichenfolgen und Substratmethoden
[Java] Verwendung der Calendar-Klasse