RecyclerView ?android:attr/selectableItemBackground ne fonctionne pas sur les articles
J'ai ce items.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:focusable="true"
android:clickable="true"
android:background="?android:attr/selectableItemBackground"
android:layout_height="wrap_content">
<ImageView
android:layout_width="match_parent"
android:layout_height="60dp"
android:id="@+id/colorPreview" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:textAppearance="@android:style/TextAppearance.Large"
android:textColor="@android:color/white"
android:id="@+id/colorName" />
</RelativeLayout>
Quand je les utiliser séparément, le selectableItemBackground anime lorsque je clique sur la vue. Mais quand je l'utilise pour les éléments dans un RecyclerView, l'effet sur le clic ne se reproduira plus. Comment puis-je résoudre ce problème?
PS: c'est le port d'écoute sur le RecyclerView, si elle est pertinente:
public ColorListOnItemTouchListener(Context context, OnItemClickListener clickListener) {
mClickListener = clickListener;
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public void onLongPress(MotionEvent e) {
if(childView != null && mClickListener != null) {
mClickListener.onItemLongPress(childView, index);
}
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
if(childView != null && mClickListener != null) {
mClickListener.onItemClick(childView, index);
}
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return false;
}
});
}
Merci!
Edit:
public class ColorsCursorAdapter extends RecyclerView.Adapter<ColorsCursorAdapter.ViewHolder> {
private static final int layout = R.layout.color_item;
private Cursor mCursor;
public ColorsCursorAdapter(Cursor c) {
super();
this.mCursor = c;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false);
TextView name = (TextView) v.findViewById(R.id.colorName);
ImageView image = (ImageView) v.findViewById(R.id.colorPreview);
return new ViewHolder(v, name, image);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
mCursor.moveToPosition(position);
int color = mCursor.getInt(mCursor.getColumnIndex(ColorItem.COLUMN_COLOR));
holder.colorName.setText(Utils.getColorString(color));
holder.colorPreview.setImageDrawable(new ColorDrawable(color));
}
@Override
public int getItemCount() {
if(mCursor != null) {
return mCursor.getCount();
}
return 0;
}
public void swapCursor(Cursor c) {
mCursor = c;
notifyDataSetChanged();
}
public Cursor getCursor() {
return mCursor;
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView colorName;
public ImageView colorPreview;
public ViewHolder(View root, TextView colorName, ImageView colorPreview) {
super(root);
root.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//
}
});
this.colorName = colorName;
this.colorPreview = colorPreview;
}
}
}
Et l'adaptateur est créé avec:
colorList.setLayoutManager(new LinearLayoutManager(this));
adapter = new ColorsCursorAdapter(null);
colorList.setAdapter(adapter);
- Avez-vous essayé de réglage onClick écoute sur le holderView adaptateur?
- Je l'ai fait... et il ne fonctionne pas
- mais avez-vous mis en écoute sur un point de vue qui a selectablebackground ensemble?
- Il fonctionne très bien pour moi (voir cet exemple de projet).
- oui, j'ai été la mise à l'auditeur sur l'élément racine de l'élément qui a le fond (RelativeLayout)
- code postal façon dont vous créez votre recycleur et adaptateur
- ajouté un peu plus de code
- Un autre chose. Remplacer "?android:attr/selectableItemBackground" avec "?attr/selectableItemBackground"
- essayé ... toujours pas de chance
- Essayez de changer de thème.
- Essayé, mais pas de l'utiliser
- Je suis coincé avec la même question. Il fonctionne même dans les autres cartes, mais pas sur une en particulier. Peut pas comprendre ce qui provoque cette. Si j'arrive à le résoudre en quelque sorte, vous avertira 🙂
Vous devez vous connecter pour publier un commentaire.
Quelque chose qui n'a pas été mentionné dans d'autres réponses: réglage
android:clickable="true"
est nécessaire afin de rendre les animations de travail quand il n'y a pas de OnClickListener attaché à la vue.Au lieu de le définir comme arrière-plan, je l'ai mis en premier plan, il fonctionne. Espérons qu'il serait utile.
Dans votre items.xml, ensemble FrameLayout comme la racine de mise en page et définir selectableItemBackground pour FrameLayout. Il fonctionne pour moi, mais je ne sais pas pourquoi.
foreground
attribut sur le bas de l'API niveaux de 23. D'autres points de vue, en plus de soutenir à partir de l'API de niveau 23.android:clickable="true"
a fonctionné pour moiVue que vous voulez avoir l'effet d'entraînement doit être cliquable. Vous pouvez soit le faire en spécifiant android:cliquables="true" dans le fichier XML ou d'un paramètre onClickListener par programmation. Lorsque vous utilisez cette sur le point à l'intérieur de RecyclerView et vous êtes à l'aide de Kotlin ensemble onClickListener sur "itemView" de ViewHolder classe.
J'ai vu le même comportement. De mon côté c'était lié au fait que quand j'ai cliqué sur un élément de liste à l'intérieur d'un fragment et directement le remplacement de ce fragment à l'autre, l'animation n'avais pas le temps d'être montré. Dès que j'ai enlevé le fragment de remplacement, j'ai pu voir l'animation.
Return false susceptible de résoudre ce problème. Pour moi, j'ai été primordial onTouch sur mon bouton et en le retournant au bout. De retour de faux permis de toucher de l'animation pour se produire à partir de réglage:
Dans mon cas, le problème a été causé par
DividerItemDecoration
. Dès que je me suis débarrassé de cela, il a commencé à travailler. Je vous suggère de mettre une ligne à la fin dexml
fichier pour chaque élément dansRecyclerView
, il est beaucoup plus facile à personnaliser et vous ne rencontrerez pas de ces sortes de problèmes.Son Travail De Codage Heureux