Cómo agregar la funcionalidad de deslizar en Android CardView?

Tengo un único CardView que contiene dos TextViews y dos ImageViews. Quiero poder deslizar hacia la izquierda y la derecha para "descartar". En realidad, quiero deslizar hacia la derecha para enviar una intención, pero que se puede hacer más tarde. Por ahora, quiero poder descartar el CardView deslizando izquierda o derecha. También quiero la animación de pasar.

Intenté usar el romannurik's SwipeDismissTouchListener pero el CardView no responde al swiping.

Si alguien tiene una solución mejor que romannurik's oyente personalizado de romannurik's , por favor comparta.

Aquí está mi diseño de CardView:

 <android.support.v7.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/generate" map:cardCornerRadius="@dimen/_3sdp" map:cardElevation="@dimen/_8sdp" android:id="@+id/restaurantContainer"> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> <ImageView android:id="@+id/thumbnail" android:layout_width="@dimen/_75sdp" android:layout_height="@dimen/_75sdp" android:layout_margin="@dimen/_5sdp" /> <ImageView android:id="@+id/rating" android:layout_width="@dimen/_75sdp" android:layout_height="@dimen/_15sdp" android:layout_margin="@dimen/_5sdp" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <TextView android:id="@+id/name" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_margin="@dimen/_5sdp" android:gravity="top" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/categories" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_margin="@dimen/_5sdp" android:textAppearance="?android:attr/textAppearanceMedium" /> </LinearLayout> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent"> <com.google.android.gms.maps.MapView android:id="@+id/mapView" android:layout_width="fill_parent" android:layout_height="fill_parent" map:cameraZoom="14" map:liteMode="true" map:mapType="normal" /> </LinearLayout> </LinearLayout> </android.support.v7.widget.CardView> 

Cómo configuro el SwipeDismissTouchListener:

 RelativeLayout rootLayout; CardView restaurantCardView; ... public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { rootLayout = (RelativeLayout) inflater.inflate(R.layout.fragment_main, container, false); restaurantCardView = (CardView) rootLayout.findViewById(R.id.restaurantContainer); restaurantCardView.setOnTouchListener(new SwipeDismissTouchListener(restaurantCardView, null, new SwipeDismissTouchListener.DismissCallbacks() { @Override public boolean canDismiss(Object token) { Log.d("Chris", "canDismiss() called with: " + "token = [" + token + "]"); return true; } @Override public void onDismiss(View view, Object token) { Log.d("Chris", "onDismiss() called with: " + "view = [" + view + "], token = [" + token + "]"); } })); .... return rootLayout; 

Puedo ver el registro de canDismiss(...) pero no de onDismiss(...) .

Usted tendrá que ponerlo dentro de RecyclerView (y su CardView como el único artículo allí)

A continuación, utilice ItemTouchHelper.SimpleCallback en itemTouchHelper.attachToRecyclerView(recyclerView);

Te dará animaciones y en

 @Override public void onSwiped(RecyclerView.ViewHolder viewHolder, int swipeDir) { } 

Puede especificar una acción particular basada en la dirección de desplazamiento.

Vea las instrucciones completas aquí: Pase a Descartar para RecyclerView

Además, tendrás que deshabilitar el desplazamiento vertical en RecyclerView :

 public class UnscrollableLinearLayoutManager extends LinearLayoutManager { public UnscrollableLinearLayoutManager(Context context) { super(context); } @Override public boolean canScrollVertically() { return false; } } ..... RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new UnscrollableLinearLayoutManager(this)); recyclerView.setAdapter(new RestaurantCardAdapter()); 

De lo contrario, una vez que intente desplazarse hacia arriba o hacia abajo, verá las animaciones de final de lista de RecyclerView .

Actualización:

Aquí está RecyclerView.Adapter que usé para la prueba:

 private class RestaurantCardAdapter extends RecyclerView.Adapter { @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new RestaurantViewHolder(new RestaurantCard(parent.getContext())); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {} @Override public int getItemCount() { return 1; } private class RestaurantViewHolder extends RecyclerView.ViewHolder { public RestaurantViewHolder(View itemView) { super(itemView); } } } 

RestaurantCard – es sólo una View personalizada (extiende CardView en nuestro caso):

 public class RestaurantCard extends CardView { public RestaurantCard(Context context) { super(context); initialize(context); } public RestaurantCard(Context context, AttributeSet attrs) { super(context, attrs); initialize(context); } private void initialize(Context context){ LayoutInflater.from(context).inflate(R.layout.card, this); // ImageView imageView = (ImageView)getView.findViewById(...); } } 
  • Problema en OnTouchListener para ImageView
  • Android deja de enviar eventos onTouch
  • Tiempo de aumento de OnLongPress
  • Reducir animadamente el tamaño del botón en la prensa y recuperar su tamaño en la versión
  • OnTouchevent () vs onTouch ()
  • Combinación de combinación de Android :: OnTouchListener && OnClickListener
  • OnTouchListener para toda la pantalla
  • Android principiante: toque eventos en android gridview
  • No puede manejar simultáneamente los eventos de clic y de toque
  • Manejo del evento de toque Intercept sin extender ViewGroup
  • Android: ¿Qué uso tiene AnchorView de MediaController?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.