No hay efecto de ondulación en el tacto en la vista de reciclaje

Tengo una vista de reciclaje con cuatro elementos de cuadrícula (2 * 2) que funcionan como un menú. Sin embargo, cuando hago clic en ellos no se muestra ningún efecto de rizo. Simplemente me lleva a la siguiente actividad sin ninguna confirmación visual de que la vista fue presionada. ¿Alguien puede ayudar?

Actividad principal

public class MainActivity extends AppCompatActivity implements MainMenuAdapter.OnItemClickListener { Toolbar toolbar; private static List<ViewModel> tileItems = new ArrayList<>(); static { tileItems.add(new ViewModel("Activity", "#3F51B5", R.drawable.activity)); tileItems.add(new ViewModel("Profile", "#E91E63", R.drawable.profile)); tileItems.add(new ViewModel("Training", "#FF5722", R.drawable.training)); tileItems.add(new ViewModel("Diet", "#4CAF50", R.drawable.diet)); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new GridLayoutManager(this, 2)); MainAdapter adapter = new MainAdapter(tileItems, MainActivity.this); recyclerView.setAdapter(adapter); adapter.setOnItemClickListener(this); // Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); } @Override public void onBackPressed() { this.moveTaskToBack(true); // this.finishAffinity(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public void onItemClick(View view, ViewModel viewModel) { } } 

MainAdapter

 public class MainAdapter extends RecyclerView.Adapter<MainMenuAdapter.ViewHolder> implements View.OnClickListener { private List<ViewModel> items; private OnItemClickListener onItemClickListener; private Context context; // Adapter constructor public MainAdapter(List<ViewModel> items, Context context) { this.items = items; this.context = context; } public void setOnItemClickListener(OnItemClickListener onItemClickListener) { this.onItemClickListener = onItemClickListener; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_item, parent, false); return new ViewHolder(v); } @Override public void onBindViewHolder(ViewHolder viewHolder, int position) { final ViewModel dataItem = items.get(position); viewHolder.colorBlock.setBackgroundColor(dataItem.getColor()); viewHolder.menuName.setText(dataItem.getName()); viewHolder.menuIcon.setImageResource(dataItem.getImage()); viewHolder.itemView.setTag(dataItem); if (dataItem.getActivity() != null) { viewHolder.colorBlock.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent i = new Intent(context, dataItem.getActivity()); context.startActivity(i); } }); } } @Override public int getItemCount() { return items.size(); } @Override public void onClick(final View v) { // Give some time to the ripple to finish the effect if (onItemClickListener != null) { new Handler().postDelayed(new Runnable() { @Override public void run() { onItemClickListener.onItemClick(v, (ViewModel) v.getTag()); } }, 200); } } /** This is our ViewHolder class */ public static class ViewHolder extends RecyclerView.ViewHolder { public TextView menuName; public View colorBlock; public ImageView menuIcon; public ViewHolder(View convertView) { super(convertView); // Must call super() first menuName = (TextView) convertView.findViewById(R.id.menuName); colorBlock = (View) convertView.findViewById(R.id.colorBlock); menuIcon = (ImageView) convertView.findViewById(R.id.menuItem); } } public interface OnItemClickListener { void onItemClick(View view, ViewModel viewModel); } } 

Activity_main.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <include android:id="@+id/toolbar" layout="@layout/toolbar" android:layout_height="wrap_content" android:layout_width="match_parent"/> <android.support.v7.widget.RecyclerView android:id="@+id/recyclerView" android:layout_below="@id/toolbar" android:layout_width= "match_parent" android:layout_height = "match_parent" /> </RelativeLayout> 

Main_item.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" android:focusable="true" android:foreground="?android:attr/selectableItemBackground"> <View android:id="@+id/colorBlock" android:layout_width="match_parent" android:layout_height="170dp" /> <ImageView android:id="@+id/menuItem" android:layout_width="120dp" android:layout_height="120dp" android:layout_centerHorizontal="true" android:padding="16dp" /> <TextView android:id="@+id/menuName" android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="16dp" android:layout_centerHorizontal="true" android:layout_alignParentBottom="true" android:textColor="@android:color/white" android:textSize="16sp"/> </RelativeLayout> 

El efecto Ripple ocurrirá (@Budius está equivocado en su comentario) si establece el fondo de main_item.xml en ?android:selectableItemBackground selectableItemBackground o ?selectableItemBackground . Encontré referencias a la segunda. Sin embargo, AndroidStudio advirtió que era un privado en com.android.support:design. Mi aplicación se estrelló al intentar utilizar esa versión privada. Supongo que en el primero con el prefijo "android:", y voila, funciona.

Tal vez usted está estableciendo android:foreground por accidente? Intenté eso pero no vi nada suceder a mis artículos de RecyclerView.

Su RelativeLayout actualizado sería:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" android:focusable="true" android:foreground="?android:attr/selectableItemBackground" android:background="?android:selectableItemBackground"> 

También he visto android:background="?android:attr/selectableItemBackground" trabajo para iniciar la ondulación. También mencionaré que el selectableItemBackground no necesita estar en el elemento raíz de la main_item.xml. Estoy utilizando un color de fondo en el elemento de la raíz, a continuación, establecer selectableItemBackground en un ViewGroup anidado.

Mi respuesta proviene de un marco de referencia NO usando el diseño de material appcompat. Sospecho que hay una diferencia si está utilizando la biblioteca de soporte de diseño appcompat material.

  • Efecto de ondulación de Android anulado por el estado seleccionado
  • ¿Cómo hacer una ondulación circular en un botón cuando se está haciendo clic?
  • RippleDrawable - Mostrar efecto de rizado por programación
  • Crear una ondulación dibujable sin transparencia
  • Android spinner no tiene rizado en el botón en sí, sólo sus opciones
  • AppCompatButton backgroundTint API <21
  • Agregar los efectos de un RippleDrawable y un StateListDrawable a un RecyclerView
  • El efecto Ripple no funciona en RelativeLayout
  • Lollipop RippleDrawable vs Selector para Pre-Lollipop
  • ¿Es esta la forma correcta de obtener el efecto de rizo en los dispositivos pre-piruletas?
  • ¿Cómo agregar efecto de rizado a las preferencias en android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.