J'ai un RecyclerView avec une zone de texte TextView et un bouton croisé ImageView. J'ai un bouton en dehors de la vue de recyclage qui rend le bouton croisé ImageView visible / disparu.
Je cherche à supprimer un élément de la recylerview, lorsque cet élément croise le bouton ImageView est enfoncé.
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 faire fonctionner quelque chose comme un onClick pour mon crossButton ImageView? Y a-t-il un meilleur moyen? Peut-être changer l'élément entier en cliquant sur un élément supprimer? La vue de recyclage affiche une liste des emplacements qui doivent être modifiés. Tout conseil technique ou commentaire / suggestion sur la meilleure mise en œuvre serait extrêmement apprécié.
java
android
user-interface
android-recyclerview
selection
Vingt et un
la source
la source
Réponses:
J'ai fait quelque chose de similaire. Dans votre
MyAdapter
:J'espère que cela t'aides.
Éditer:
getPosition()
est obsolète maintenant, utilisez à lagetAdapterPosition()
place.la source
notifyItemRangeChanged(getPosition, mDataSet.size());
à la réponse de paradite après avoir supprimé l'élément afin que toutes les vues sous l'élément supprimé s'ajusteront en conséquence.getPosition()
est maintenant obsolètenotifyItemRemoved(position)
il ne suffisait pas d' appeler .tout d'abord, l'élément doit être supprimé de la liste!
puis:
la source
si l'élément n'est toujours pas supprimé, utilisez cette méthode magique :)
Version Kotlin
la source
Problème
RecyclerView
est, par défaut, ignorant des modifications de votre jeu de données. Cela signifie que chaque fois que vous effectuez une suppression / ajout sur votre liste de données, ces modifications ne seront pas répercutées directement sur votre RecyclerView.Solution
RecyclerView vous propose quelques méthodes pour partager l'état de votre ensemble de données. Cela se produit car une modification de votre ensemble de données n'implique pas de changement de vue, et vice versa. Les API Android standard vous permettent de lier le processus de suppression de données (aux fins de la question) au processus de suppression de vue.
Meilleure approche
Si vous ne spécifiez pas correctement ce qui se passe lors de votre ajout / suppression d'éléments (en parlant de vues), les enfants de RecyclerView sont animés sans réponse en raison d'un manque d'informations sur la façon de déplacer les différentes vues dans la liste.
Au lieu de cela, le code suivant lira précisément l'animation, uniquement sur l'enfant qui est en cours de suppression (et en remarque, pour moi, il a corrigé tous les
IndexOutOfBoundException
s, marqués par le stacktrace comme "incohérence des données")Sous le capot, si nous regardons,
RecyclerView
nous pouvons trouver de la documentation expliquant que le deuxième paramètre que nous devons passer est le nombre d'éléments supprimés de l'ensemble de données, et non le nombre total d'éléments (comme indiqué à tort dans certaines autres sources d'informations).la source
Peut-être une réponse en double mais très utile pour moi. Vous pouvez implémenter la méthode indiquée ci-dessous
RecyclerView.Adapter<RecyclerView.ViewHolder>
et utiliser cette méthode selon vos besoins, j'espère que cela fonctionnera pour vousla source
Voici quelques exemples visuels supplémentaires. Voir ma réponse plus complète pour des exemples d'ajout et de suppression d'une plage.
Ajouter un seul élément
Ajoutez "Pig" à l'index
2
.Supprimer un seul élément
Supprimez "Pig" de la liste.
la source
J'ai essayé toutes les réponses ci-dessus, mais l'insertion ou la suppression d'éléments dans recyclerview pose un problème avec la position dans le dataSet.
delete(getAdapterPosition());
J'ai fini par utiliser à l'intérieur de viewHolder qui fonctionnait très bien pour trouver la position des éléments.la source
Le problème que j'ai eu était que je supprimais un élément de la liste qui n'était plus associé à l'adaptateur pour m'assurer que vous modifiez l'adaptateur approprié, vous pouvez implémenter une méthode comme celle-ci dans votre adaptateur:
Et appelez-le dans votre fragment ou activité comme ceci:
la source
j'espère que cela vous aidera.
la source
si vous souhaitez supprimer un élément, vous devez faire ceci: d'abord supprimer l'élément:
à l'étape suivante, vous devez informer votre adaptateur de recyclage que vous supprimez un élément par ce code:
mais si vous modifiez un élément, procédez comme suit: modifiez d'abord un paramètre de votre objet comme ceci:
ou nouveau comme ceci:
puis informez votre adaptateur de recyclage que vous modifiez un article par ce code:
l'espoir vous aide.
la source
la source
notifyItemRemoved(position)
.Méthode pour
onBindViewHolder
écrire ce codela source
Incase Anyone veut implémenter quelque chose comme ça dans la classe Main au lieu de la classe Adapter, vous pouvez utiliser:
où friendsListRecycler est le nom de l'adaptateur
la source
la source
faire de l'interface une classe d'adaptateur personnalisée et gérer l'événement de clic sur la vue du recycleur.
après avoir défini l'adaptateur et lié à la vue du recycleur appelé ci-dessous le code.
la source
Au cas où vous vous demanderiez comme je l'ai fait, où pouvons-nous obtenir la position de l'adaptateur dans la méthode getadapterposition (); c'est dans l'objet viewholder.vous devez donc mettre votre code comme ceci
la source
la source