Android RecyclerView plus & suppression d'éléments
J'ai un RecyclerView avec un TextView zone de texte et un bouton croix ImageView. J'ai un bouton à l'extérieur de la recyclerview qui rend le bouton croix ImageView visible /disparu.
Je suis à la recherche pour supprimer un élément de la recylerview, lorsque que les éléments de la croix bouton ImageView est pressé.
Mon adaptateur:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> implements View.OnClickListener, View.OnLongClickListener {
private ArrayList<String> mDataset;
private static Context sContext;
public MyAdapter(Context context, ArrayList<String> myDataset) {
mDataset = myDataset;
sContext = context;
}
@Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_text_view, parent, false);
ViewHolder holder = new ViewHolder(v);
holder.mNameTextView.setOnClickListener(MyAdapter.this);
holder.mNameTextView.setOnLongClickListener(MyAdapter.this);
holder.mNameTextView.setTag(holder);
return holder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.mNameTextView.setText(mDataset.get(position));
}
@Override
public int getItemCount() {
return mDataset.size();
}
@Override
public void onClick(View view) {
ViewHolder holder = (ViewHolder) view.getTag();
if (view.getId() == holder.mNameTextView.getId()) {
Toast.makeText(sContext, holder.mNameTextView.getText(), Toast.LENGTH_SHORT).show();
}
}
@Override
public boolean onLongClick(View view) {
ViewHolder holder = (ViewHolder) view.getTag();
if (view.getId() == holder.mNameTextView.getId()) {
mDataset.remove(holder.getPosition());
notifyDataSetChanged();
Toast.makeText(sContext, "Item " + holder.mNameTextView.getText() + " has been removed from list",
Toast.LENGTH_SHORT).show();
}
return false;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView mNumberRowTextView;
public TextView mNameTextView;
public ViewHolder(View v) {
super(v);
mNameTextView = (TextView) v.findViewById(R.id.nameTextView);
}
}
}
Ma mise en page est:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
android:id="@+id/layout">
<TextView
android:id="@+id/nameTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:padding="5dp"
android:background="@drawable/greyline"/>
<ImageView
android:id="@+id/crossButton"
android:layout_width="16dp"
android:layout_height="16dp"
android:visibility="gone"
android:layout_marginLeft="50dp"
android:src="@drawable/cross" />
</LinearLayout>
Comment puis-je obtenir quelque chose comme un onClick de travail pour mon crossButton ImageView? Est-il un meilleur moyen? Peut-être en changeant le point onclick dans un supprimer l'article? Le recyclerview montre une liste d'endroits qui ont besoin d'être modifiés. Tous les conseils techniques ou des commentaires /suggestions sur la meilleure mise en œuvre serait très apprécié.
- Prendre un coup d'oeil LIEN 1 LIEN 2 il peut aider à U
- stackoverflow.com/questions/38222410/...
- Vous pouvez voir cet exemple sur Github Heureux de code!!!!
Vous devez vous connecter pour publier un commentaire.
J'ai fait quelque chose de similaire.
Dans votre
MyAdapter
:Espère que cette aide.
Edit:
getPosition()
est obsolète maintenant, utilisezgetAdapterPosition()
à la place.notifyItemRangeChanged(getPosition, mDataSet.size());
à paradite de réponse après la suppression de l'élément, de sorte que tous les points de vue ci-dessous l'élément supprimé ajustera en conséquence.getPosition()
est maintenant obsolètenotifyItemRemoved(position)
n'était pas assez.notifyItemRangeChanged()
, qui me donnait mal à la têteindex out of bounds exception
) vous pouvez utiliser ` si (titulaire.getAdapterPosition() != RecyclerView.NO_POSITION) { //votre code ici } dansOnClickMethod
tout d'abord, l'élément doit être supprimé de la liste!
alors:
si item supprimé pas utiliser cette méthode magique 🙂
Éventuellement une double réponse, mais est très utile pour moi. Vous pouvez mettre en œuvre la méthode donnée ci-dessous dans
RecyclerView.Adapter<RecyclerView.ViewHolder>
et peut utiliser cette méthode en fonction de vos exigences, j'espère qu'il va travailler pour vous
Fait avec le mentionné précédemment code (Que vous pouvez trouver ci-dessous), tous les RecyclerView childs sont animés lorsqu'un seul élément est supprimé et ce n'est pas une solution réactive à tous, aussi parce qu'il a un certain potentiel caché questions
Au lieu de cela, l'extrait de code suivant va jouer l'animation, tout sur l'enfant qui est en cours de suppression, et de ma part, il a cessé de jeter
IndexOutOfBoundException
s, marquée par le débogueur comme "l'incohérence des données"Si nous creusons dans
RecyclerView
classe, nous pouvons trouver une pice de javadoc qui a l'explication, en effet comme deuxième paramètre, nous avons passer le nombre d'éléments qui sont supprimés à partir de l'ensemble de données, et non pas le nombre total d'élémentsJ'ai essayé toutes les réponses ci-dessus, mais l'insertion ou la suppression d'éléments à recyclerview cause des problèmes avec la position dans le jeu de données. Fini à l'aide de
delete(getAdapterPosition());
à l'intérieur de la viewHolder qui a travaillé beaucoup sur la recherche de la position des éléments.Le problème que j'ai eu, c'est la suppression d'un élément de la liste qui n'est plus associé à la carte pour s'assurer que vous êtes en train de modifier le bon adaptateur, vous pouvez mettre en œuvre une méthode de ce genre dans votre carte:
Et de l'appeler dans votre fragment ou une activité comme ceci:
Voici quelques visuels supplémentaires exemples. Voir ma réponse plus complète pour des exemples d'ajout et la suppression d'une plage.
Ajouter un seul élément
Ajouter "Cochon" à l'index
2
.Retirer seul élément
Supprimer "Cochon" à partir de la liste.
j'espère que cela contribuera u.
si vous voulez supprimer un élément que vous devriez faire ceci:
d'abord supprimer l'élément:
dans la prochaine étape, vous devez en informer votre recycleur adaptateur que vous supprimez un élément par ce code:
mais si vous modifiez un élément de ce faire:
premier changement d'un paramètre de votre objet comme ceci:
ou nouveaux comme ceci :
puis en informer votre recycleur adaptateur que vous modifiez un élément par ce code:
espère que vous aide.
notifyItemRemoved(position)
.Au cas où quelqu'un veut mettre en place quelque chose comme cela dans la classe Principale de la place de l'Adaptateur de classe, vous pouvez utiliser l'option " public void removeAt(int position) {
peopleListUser.supprimer(position);
où friendsListRecycler est le nom de la Carte
faire l'interface en classe personnalisée et de manutention événement de clic sur le recycleur de vue..
après définir adaptateur et les lier en recycleur de vue appelé code ci-dessous..
À La Méthode
onBindViewHolder
Écrire Ce Code