** Diese Seite verlinkt einige Beiträge in Qiita. Wenn Sie es unangenehm finden, kommentieren Sie bitte. Wir werden korrespondieren. ** ** **
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.
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.
adapter_row.xml
DataModel.java
ViewHolder.java
Adapter.java
** Dieses Mal setzen wir die Daten als Bild und Zeichenkette. ** ** **
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>
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.
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.
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();
}
}
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;
}
}
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
?)
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