2017-01-23 8 views
1

リサイクラのビュー項目を追加しているときにアニメーション化したいと考えています。スクロールしたり、アイテムを追加したりした後ではありません。私が模倣しようとしている動作は、FloatingActionMenuがあり、そのメニューにFloatingActionButtonsを追加したときと似ています。メニューが開き、項目が1つずつ表示されます。この動作をどうすれば達成できますか?私は、より複雑なビューを膨らませたいので、FloatingActionMenuまたはFloatingActionButtonsを使用していません。あなたが見ることができるように、これらのメニューは、私がonBindViewHolderにアニメーションを追加しようとしている リサイクラビューでフローティングアクションボタンのメニュービヘイビアを作成する方法は?

https://forum.ionicframework.com/uploads/default/original/1/3/130fe3336b32906959f2ab00e71c276c5acc9ca4.jpg

を制限されているが、これは遅すぎます。アイテムはすべて同時に追加され、アニメーションはすべて順番にではなく同時に発生します。考えられる唯一のアイデアは、アダプターにアイテムを1つずつ追加し、notifyDataSetの変更を利用することでしたが、より良いアプローチがあるかどうかを確認するためにコミュニティの脳を選びたかったのです。ここに私のアダプタは、私が試してみましたいくつかの他のものは
LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
    layoutManager.setReverseLayout(true); 
    layoutManager.setStackFromEnd(true); 
    rv.setLayoutManager(layoutManager); 
    mAdapter = new MyAdapter(mContext, mContent); 
    rv.setAdapter(mAdapter); 

これは私が私のアダプタにデータを初期化して送信しています方法です

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 

    private final static int FADE_DURATION = 10000; // in milliseconds 
    private Context mContext; 
    private String[] mContent; 

    public MyAdapter(Context context, String[] content) { 
     mContext = context; 
     mContent = content; 
    } 

    @Override 
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.items, parent, false)); 
    } 

    @Override 
    public void onBindViewHolder(MyAdapter.ViewHolder holder, int position) { 
     holder.tvText.setText(mContent[position]); 
     // Set the view to fade in 
     setScaleAnimation(holder.itemView); 
    } 

    @Override 
    public int getItemCount() { 
     return mContent.length; 
    } 

    private void setFadeAnimation(View view) { 
     AlphaAnimation anim = new AlphaAnimation(0.0f, 1.0f); 
     anim.setDuration(FADE_DURATION); 
     view.startAnimation(anim); 
    } 

    private void setScaleAnimation(View view) { 
     ScaleAnimation anim = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f, 
       Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 
     anim.setDuration(FADE_DURATION); 
     view.startAnimation(anim); 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder { 

     private TextView tvText; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      tvText = (TextView) itemView.findViewById(R.id.tv_text); 
     } 
    } 
} 

でそれらが追加された項目のタイミングを制御することです。私はsetItemAnimatorを使って試してみて、アイテムのaddDurationを設定しました。これのどれも期待どおりに動作しません。

LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
    layoutManager.setReverseLayout(true); 
    layoutManager.setStackFromEnd(true); 
    rv.setLayoutManager(layoutManager); 
    mAdapter = new MyAdapter(mContext, mContent); 
    DefaultItemAnimator animation = new DefaultItemAnimator(); 
    animation.setAddDuration(100000); // << this attribute seems to make no difference 
    rvItems.setItemAnimator(animation); 
    rv.setAdapter(mAdapter); 
+0

おそらく、[ 'ItemAnimator'](https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ItemAnimator.html)を作成します。最初から起動する必要はありません。そのページにリストされている既存のサブクラスの1つを拡張するだけで十分です。 – Karakuri

+0

@Karakuri itemAnimatorはスクロール可能なアイテムでのみ動作するようです。だから私がスクロールすると、最初の項目で行われるアニメーションがスクロール時に追加されました。アイテムを追加してバインドする前にアイテムを傍受する必要があります。 – portfoliobuilder

+0

「スクロール可能な」アイテムが何を意味するのか分かりません。ドキュメントは、アイテムの追加、移動、変更、および削除をアニメートできることを示唆しています。 – Karakuri

答えて

0

どのようにこれが可能か疑問に思う人のために、私はハンドラを使用したソリューションを考え出しました。基本的に、アイテムを1つずつ挿入したいとします。あなたのハンドラはこれを可能にするものです。

 final Handler handler = new Handler(); 
     final Runnable runnable = new Runnable() { 
      @Override 
      public void run() { 
       mItemCounter++; 
       ArrayList<Model> temp = new ArrayList<>(); 
       for (int i = 0; i < mItemCounter; i++) { 
        if (i < Model.description.size()) { 
         temp.add(Model.description.get(i)); 
        } 
       } 

       if (mItemCounter < Model.description.size()) { 
        if (mItemCounter == 1) { 
         mAdapter = new MyAdapter(mContext, temp); 
         rv.setAdapter(mAdapter); 
        } else { 
         mAdapter.insert((mItemCounter - 1), temp.get(mItemCounter - 1)); 
        } 
        handler.postDelayed(this, 150); 
       } 
      } 
     }; 
     handler.postDelayed(runnable, 175); 

あなたは順次、アイテムを一つずつを追加できるように、アダプタにinsertメソッドを追加します。

public void insert(int position, Model model) { 
    mModel.add(position, model); 
    notifyItemInserted(position); 
} 

残りの設定は、何をしたいかによって異なります。私はメニューを上から開くようにしたかったので、LayoutManagerも更新しなければなりませんでした。最初にレイアウトを反転し、スタックを終わりから偽に設定しました。これにより、フローティングアクションボタンをボトムアップから開くのと同様の効果が得られます。

rv = (RecyclerView) findViewById(R.id.rv); 
    LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    layoutManager.setReverseLayout(true); 
    layoutManager.setStackFromEnd(false); 
    rv.setLayoutManager(layoutManager); 
関連する問題