2016-01-05 19 views
6

Ho un singolo CardView che contiene due TextViews e due ImageViews. Voglio essere in grado di scorrere verso sinistra e destra per "respingere". In realtà voglio scorrere verso destra per inviare un Intent, ma ciò può essere fatto in seguito. Per ora, voglio essere in grado di chiudere il CardView facendo scorrere verso sinistra o verso destra. Voglio anche l'animazione dello swiping.Come aggiungere la funzionalità di scorrimento su Android CardView?

Ho provato a utilizzare romannurik's SwipeDismissTouchListener ma CardView non risponde allo scorrimento.

Se qualcuno ha una soluzione migliore del listener personalizzato romannurik's, si prega di condividere.

Ecco il mio layout a schede:

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

Come ho configurato lo 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; 

sono in grado di visualizzare il registro da canDismiss(...) ma non da onDismiss(...).

risposta

9

Dovrete ad inserirlo all'interno RecyclerView (e la vostra CardView come l'unico elemento lì)

Poi, utilizzare ItemTouchHelper.SimpleCallback-itemTouchHelper.attachToRecyclerView(recyclerView);

Vi darà le animazioni e in

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

è possibile specificare un'azione particolare in base alla direzione di scorrimento.

osservare le istruzioni qui: Swipe to Dismiss for RecyclerView

Inoltre, dovrete disattivare scorrimento verticale in 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()); 

In caso contrario - una volta che si tenta di scorrere verso l'alto o verso il basso - si aveva vedere le animazioni di fine elenco RecyclerView.

Upd:

Ecco RecyclerView.Adapter ho usato per il test:

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 - è solo una consuetudine View (estende CardView nel nostro 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(...); 
    } 
} 
+0

Impressionante, ho apprezzo davvero la tua risposta dettagliata. Ho una domanda: visto che uso solo un CardView, qual è il modo migliore per creare il 'RestaurantCardAdapter'? Tutti gli esempi online sono per gli elenchi. C'è qualcosa che dovrei fare in particolare? Non voglio rimanere bloccato da qualche parte e passare il mio tempo a cercare di correggere stupidi errori haha. – ctzdev

+1

@ChrisTarazi Ho aggiornato la risposta con Adapter & ViewHolder che ho usato per testare l'idea. In bocca al lupo! Qualsiasi domanda - basta chiedere –

+0

Ho problemi con 'onCreateViewHolder (...)'. Penso che dobbiamo gonfiare una vista basata su ciò che ho visto online. Perché in 'onBindViewHolder (...)', il mio riferimento a 'TextViewHolder' per' TextViews' e 'ImageViews' sono' null'.Quindi ci deve essere qualcosa con le opinioni che ci stanno perdendo. – ctzdev

Problemi correlati