** Ce site relie certains articles de Qiita. Si vous trouvez cela désagréable, veuillez commenter. Nous correspondrons. ** **
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 ''.
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.
adapter_row.xml
DataModel.java
ViewHolder.java
Adapter.java
** Cette fois, mettons les données sous forme d'image et de chaîne de caractères. ** **
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>
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.
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.
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();
}
}
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;
}
}
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»?)
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