2016-01-05 25 views
6

İki TextView ve iki ImageView içeren tek bir CardView var. "İşten çıkar" için sola ve sağa kaydırmak istiyorum. Aslında bir niyet göndermek için hızlıca kaydırma yapmak istiyorum ancak daha sonra yapılabilir. Şimdilik, CardView'ı sola veya sağa kaydırarak kapatmak istiyorum. Ben de swiping animasyonunu istiyorum.Android CardView'da kaydırma işlevi nasıl eklenir?

romannurik's SwipeDismissTouchListener kullanmayı denedim ancak CardView hızlıca kaydırmaya yanıt vermiyor.

romannurik's özel dinleyiciden daha iyi bir çözümü varsa, lütfen paylaşın.

İşte benim CardView düzeni aşağıdaki gibidir:

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

nasıl kurulum 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; 

ben onDismiss(...) den canDismiss(...) ancak gelen günlüğünü görmek mümkün duyuyorum.

cevap

9

Sen RecyclerView içine koymak gerekecek (ve orada sadece öğe olarak CardView) Sonra

, Size animasyonlar verecek ItemTouchHelper.SimpleCallback

itemTouchHelper.attachToRecyclerView(recyclerView); için kullanmak ve içinde

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

, kaydırma yönüne bağlı olarak belirli bir eylem belirtebilirsiniz.

tamamını buradan talimat bakınız: Ayrıca Swipe to Dismiss for RecyclerView

, sen RecyclerView dikey kaydırma devre dışı gerekecek:

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()); 

Aksi - aşağı veya yukarı kaydırma çalışacağım kez - şimdi etsen RecyclerView listenin son animasyonlarına bakın.

Upd: İşte test için kullanılan RecyclerView.Adapter

var: -: Ben,

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

Müthiş

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 sadece özel View (bizim durumumuzda CardView uzanır) 'dir detaylı cevabınızı gerçekten takdir edin. Bir sorum var: Sadece bir CardView kullanıyorum, 'RestaurantCardAdapter' yaratmanın en iyi yolu nedir? Tüm çevrimiçi örnekler listeler içindir. Özellikle yapmam gereken bir şey var mı? Sadece bir yere takılmak istemiyorum ve zamanımı aptalca hataları düzeltmeye harcamıyorum. – ctzdev

+1

@ChrisTarazi Ben bu fikri test etmek için kullandığım Adaptör & ViewHolder ile güncelledim. İyi şanslar! Herhangi bir sorunuz var - sadece –

+0

'dan soruyorum 'onCreateViewHolder (...)' ile sorun yaşıyorum. Sanırım çevrimiçi gördüklerime dayanarak bir görünümü şişirmemiz gerekiyor. Çünkü "onBindViewHolder (...)", "RestaurantViewHolder" öğesinin "TextViews" ve "ImageViews" referansları "null".Yani eksik olduğumuz görüşlere sahip bir şey olmalı. – ctzdev