Tengo este 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>

Cuando se utilizan por separado, el selectableItemBackground anima cuando hago clic en la vista. Pero cuando yo lo uso para los elementos de una RecyclerView, el efecto en haga clic en no suceda nunca más. ¿Cómo puedo solucionar este problema?

PS: este es el oyente en el RecyclerView, si es 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;
        }
    });
}

Gracias!

Edición:

 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;
}
}
}

Y el adaptador se crea con:

colorList.setLayoutManager(new LinearLayoutManager(this));
adapter = new ColorsCursorAdapter(null);
colorList.setAdapter(adapter);
  • ¿Usted ha intentado establecer onClick de escucha en la holderView en el adaptador?
  • Yo lo hice… y no funcionó
  • pero, ¿conjunto de escucha en un punto de vista que ha selectablebackground conjunto?
  • Funciona muy bien para mí (ver este proyecto de ejemplo).
  • sí, yo era fijar el detector en el elemento raíz del elemento que tiene el fondo (RelativeLayout)
  • el código postal de cómo crear tu empresa de reciclaje y adaptador de
  • añadido algo más de código
  • Otra cosa. Reemplazar «?android:attr/selectableItemBackground» con «?attr/selectableItemBackground»
  • probé … no ha habido suerte
  • Trate de cambiar el tema.
  • Lo intentaron, pero no uso
  • Estoy atascado con el mismo problema. Funciona incluso en otros adaptadores, pero no en uno en particular. No puedo entender qué es lo que causa esto. Si puedo arreglarlo de alguna manera, le notificaremos a usted 🙂

InformationsquelleAutor Matei Suica | 2015-06-24

8 Comentarios

  1. 42

    Algo que no fue mencionado en otras respuestas: configuración de android:clickable="true" es necesario para hacer las animaciones de trabajo cuando no hay OnClickListener adjunta a la vista.

  2. 15

    Lugar de establecer como fondo, me puse como primer plano, funciona. La esperanza sería útil.

    android:foreground="?attr/selectableItemBackground"
    • No creo que se va a trabajar en API por debajo de los 23 sin embargo.
    • hay una manera de hacer que funcione para la api de niveles por debajo de los 23 ?
  3. 8

    En su items.xml, establecer FrameLayout como la raíz de diseño y establecer selectableItemBackground para FrameLayout. A mí me funciona, pero no sé por qué.

    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:foreground="?android:selectableItemBackground">
    <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <!-- your code -->
    </RelativeLayout>
    </FrameLayout>
    • La razón de esto es, que FrameLayout apoya la foreground atributo en la parte inferior de la API de los niveles de 23. Otras opiniones del mismo apoyo que a partir de la API de nivel 23.
    • Con esto en combinación con android:clickable="true" trabajado para mí
    • cuando me puse a hacer clic a la verdad, no acabo de recibir mi OnClickListener eventos.
  4. 2

    Vista que desea tener efecto dominó tiene que ser seleccionables. Usted puede hacerlo mediante la especificación de android:clickable=»true» en el archivo XML de configuración onClickListener mediante programación. Cuando se utiliza este elemento en el interior de RecyclerView y está utilizando Kotlin conjunto onClickListener en «itemView» de ViewHolder clase.

  5. 0

    He visto el mismo comportamiento. A mi lado estaba relacionado con el hecho de que, cuando hice clic en un elemento de lista dentro de un fragmento y directamente la sustitución del fragmento con otro, la animación no había ningún tiempo para ser mostrado. Tan pronto como me quita el fragmento de reemplazo, pude ver la animación.

  6. 0
    @Override
    public boolean onSingleTapUp(MotionEvent e) {
    if(childView != null && mClickListener != null) {
    mClickListener.onItemClick(childView, index);
    }
    return true;
    }

    Return false pueda solucionar este problema. Para mí, yo era primordial onTouch en mi botón y devuelve true al final. Devolviendo false habilitado el toque de animación a suceder a partir de configuración:

    android:background="?attr/selectableItemBackground"
  7. 0

    En mi caso el problema fue causado por DividerItemDecoration. Tan pronto como me deshice de que, se comenzó a trabajar. Sugiero poner una línea al final de xml archivo para cada elemento en RecyclerView, es mucho más fácil de personalizar y que no se ejecutará en estos tipos de problemas.

  8. -1

    Su Trabajo Feliz Codificación

     <LinearLayout
    android:id="@+id/lly_root"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="3"
    android:clickable="true"
    android:foreground="?android:attr/selectableItemBackground"
    android:orientation="horizontal"
    android:layout_margin="10dp">
    </LinearLayout>

Dejar respuesta

Please enter your comment!
Please enter your name here