2016-03-21 3 views
9

https://github.com/h6ah4i/android-advancedrecyclerview高度RecyclerViewライブラリ - コード例

これは、それが提供するもの機能性の面で大きなライブラリーのようです。しかし、それは良い文書が欠けています。それはSwipeableの項目の "チュートリアル"を持っていますが、他の人のように私はそれに従うことができませんでした。

誰かが実際の例を持っていますか、誰かがこのライブラリを使用して項目をスワイプしてその下にボタンを表示するという簡単なユースケースを作成できますか?この機能に興味を持っている多くの人にとっては便利です。

+1

私はプロジェクトに依存関係を追加したときにドキュメントを見つけることができません。それは非常によく、それはそれを使用することになると、しかし、サンプルアプリケーションを使用して行うことができます...私は失った。このライブラリについてもっと知っている人がいらっしゃいましたら、私は代替案を試してみたいと思っています。/ – Jethro

+0

もう少し詳しく書かれた[代替](https://github.com/davideas/FlexibleAdapter/wiki)があります。 –

+0

うわーこれは私の質問や欲望の答えかもしれないと思います!大幅に文書化されているようですが、まだ見ていません。どうもありがとうございました。あなたが望むなら、あなたのコメントを答えにしてください。 – iBobb

答えて

1

ライブラリが十分に文書化され、使いやすいことがわかりました。

hereというボタンの下にスワイプを実装するために必要なオリジナルのサンプルからコードを選択しました。

ヒントに従えば、サンプルが実装されているパターンを理解しやすくなるでしょう。

Basicサンプル
:活動が含まれているためにどのようLauncherPageFragment

概要

createAdapter方法は

は、すべてのサンプルは、2つのパターンのいずれかに従っていますどの概要を説明します基本サンプルの場合、リサイクラビューに必要なアダプタとビューホルダは、sa私の活動クラス。

複素サンプル
複雑なサンプルの場合、アダプタとビューホルダは別々に作成され、リサイクラビューは他の断片自体に定義されています。
そのような場合には、活性において付加されるさらなる断片が存在する。これらは、com.h6ah4i.android.example.advrecyclerview.common.fragmentパッケージにあります。これは、リサイクラビューに表示する必要があるデータを提供するために使用されます。あなたが作成する必要があるボタンとスワイプのために

RecyclerViewTouchActionGuardManager(スワイプ-却下アニメーションが実行されている間、スクロールを抑制するため)とRecyclerViewSwipeManagerはラップアダプタを作成します。

adapaterの場合、SwipeableItemAdapterインタフェースを実装し、ビュー所有者がRecyclerView.ViewHolderの代わりにAbstractSwipeableItemViewHolderを拡張する必要があります。

注: 私はそれがitemviewにいくつかの背景を設定し、元のサンプルではonSetSwipeBackground の実装を変更しました。
これは、下のビューを表示する場合には必要ありませんでした。また、不必要な再描画を引き起こしていました。

1

あなたがメインのウェブサイトでより良い詳細なドキュメントを見つけることができます: https://advancedrecyclerview.h6ah4i.com

と、次のドキュメントにswipeableページからコピーされます。


ステップ1.アダプターは、安定したサポートしてくださいID

この手順は非常に重要です。アダプターは、いくつかの奇妙な行動が発生します安定&固有のID、(間違ったアニメーション、NPE、など...)アイテムビュー

class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { 
    MyAdapter() { 
     setHasStableIds(true); 
    } 

    @Override 
    public long getItemId(int position) { 
     // requires static value, it means need to keep the same value 
     // even if the item position has been changed. 
     return mItems.get(position).getId(); 
    } 
} 

ステップ2.修正レイアウトファイルを返さない場合

別のFrameLayoutのwhitchでラップするコンテンツビューは@+id/container IDです。 AbstractSwipeableItemViewHolder

<!-- for itemView --> 
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="56dp"> 
    <!-- Content View(s) --> 
    <TextView 
     android:id="@android:id/text1" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="center"/> 
</FrameLayout> 

⏬⏬⏬

<!-- for itemView --> 
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="56dp"> 

    <!-- for getSwipeableContainerView() --> 
    <FrameLayout 
     android:id="@+id/container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <!-- Content View(s) --> 
     <TextView 
      android:id="@android:id/text1" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:gravity="center"/> 

    </FrameLayout> 
</FrameLayout> 

ステップ3.変更ViewHolder

  1. 変更親クラス。
  2. getSwipeableContainerView()メソッドを実装します。

注:AbstractSwipeableItemViewHolderクラスSwipeableItemViewHolder `のboilerplace方法を実装する便利なクラスです。

⏬⏬⏬

class MyAdapter ... { 
    static class MyViewHolder extends AbstractSwipeableItemViewHolder { 
     TextView textView; 
     FrameLayout containerView; 

     public MyViewHolder(View v) { 
      super(v); 
      textView = (TextView) v.findViewById(android.R.id.text1); 
      containerView = (FrameLayout) v.findViewById(R.id.container); 
     } 

     @Override 
     public View getSwipeableContainerView() { 
      return containerView; 
     } 
    } 
} 

ステップ4. SwipeableItemAdapterインターフェース

class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> { 
    ... 
} 

⏬⏬⏬

を実装しますRecyclerView

class MyAdapter 
     extends RecyclerView.Adapter<MyAdapter.MyViewHolder> 
     implements SwipeableItemAdapter<MyAdapter.MyViewHolder> { 

    @Override 
    public int onGetSwipeReactionType(MyViewHolder holder, int position, int x, int y) { 
     // Make swipeable to LEFT direction 
     return Swipeable.REACTION_CAN_SWIPE_LEFT; 
    } 

    @Override 
    public void onSetSwipeBackground(MyViewHolder holder, int position, int type) { 
     // You can set background color/resource to holder.itemView. 

     // The argument "type" can be one of the followings; 
     // - Swipeable.DRAWABLE_SWIPE_NEUTRAL_BACKGROUND 
     // - Swipeable.DRAWABLE_SWIPE_LEFT_BACKGROUND 
     // (- Swipeable.DRAWABLE_SWIPE_UP_BACKGROUND) 
     // (- Swipeable.DRAWABLE_SWIPE_RIGHT_BACKGROUND) 
     // (- Swipeable.DRAWABLE_SWIPE_DOWN_BACKGROUND) 

     if (type == Swipeable.DRAWABLE_SWIPE_LEFT_BACKGROUND) { 
      holder.itemView.setBackgroundColor(Color.YELLOW); 
     } else { 
      holder.itemView.setBackgroundColor(Color.TRANSPARENT); 
     } 
    } 

    @Override 
    public SwipeResultAction onSwipeItem(MyViewHolder holder, int position, int result) { 
     // Return sub class of the SwipeResultAction. 
     // 
     // Available base (abstract) classes are; 
     // - SwipeResultActionDefault 
     // - SwipeResultActionMoveToSwipedDirection 
     // - SwipeResultActionRemoveItem 
     // - SwipeResultActionDoNothing 

     // The argument "result" can be one of the followings; 
     // 
     // - Swipeable.RESULT_CANCELED 
     // - Swipeable.RESULT_SWIPED_LEFT 
     // (- Swipeable.RESULT_SWIPED_UP) 
     // (- Swipeable.RESULT_SWIPED_RIGHT) 
     // (- Swipeable.RESULT_SWIPED_DOWN) 

     if (result == Swipeable.RESULT_LEFT) { 
      return new SwipeResultActionMoveToSwipedDirection() { 
       // Optionally, you can override these three methods 
       // - void onPerformAction() 
       // - void onSlideAnimationEnd() 
       // - void onCleanUp() 
      }; 
     } else { 
      return new SwipeResultActionDoNothing(); 
     } 
    } 
} 

ステップ5変更の初期化プロセスは、あなたのActivity/Fragmentにいくつかの追加の初期化プロセスを置きます。

  1. インスタンス化RecyclerViewSwipeManager
  2. ラップされたアダプタを作成し、RecyclerViewに設定します。
  3. RecyclerViewからRecyclerViewSwipeManagerを付けます。

void onCreate() { 
    ... 

    RecyclerView recyclerView = findViewById(R.id.recyclerView); 
    MyAdapter adapter = new MyAdapter(); 

    recyclerView.setAdapter(adapter); 
    recyclerView.setLayoutManager(new LinearLayoutManager(this)); 
} 

⏬⏬⏬

void onCreate() { 
    ... 

    RecyclerView recyclerView = findViewById(R.id.recyclerView); 
    RecyclerViewSwipeManager swipeManager = new RecyclerViewSwipeManager(); 

    MyAdapter adapter = new MyAdapter(); 
    RecyclerView.Adapter wrappedAdapter = swipeManager.createWrappedAdapter(adapter); 

    recyclerView.setAdapter(wrappedAdapter); 
    recyclerView.setLayoutManager(new LinearLayoutManager(this)); 

    // disable change animations 
    ((SimpleItemAnimator) mRecyclerView.getItemAnimator()).setSupportsChangeAnimations(false); 

    swipeManager.attachRecyclerView(recyclerView); 
} 

私は私の答えは役立つことを願っています。

+0

このリンクは質問に答えるかもしれませんが、その答えの本質的な部分をここに含めて、参考のためのリンクを提供してください。リンクされたページが変更された場合、リンクのみの回答は無効になります。 - [レビューの投稿](レビュー/低品質の投稿/ 16457078) –

+0

@ Dev-iLレビューを今すぐ変更していただけますか? – Zacktamondo

+0

こんにちは@Zacktamondo、私はあなたが何を意味しているのか分かりません - レビューは投稿の以前のバージョンを参照しているので、投稿が編集されたことがわかります_afterwards_ - レビューコメントの意図された結果です。私はあなたにこのことを-1与えず、あなたが新しいユーザーであり、あなたの行動がSOで奨励されている(つまりあなたの投稿を編集してレビューに応答する) –