2017-01-23 32 views
1

我想在回收商查看物品時添加動畫。不是當我滾動,或者在項目被添加之後。我試圖模仿的行爲與當您有FloatingActionMenu並將FloatingActionButtons添加到該菜單時類似。菜單打開,逐個顯示項目。我如何完成這種行爲?我沒有使用FloatingActionMenu或FloatingActionButtons,因爲我想膨脹更復雜的視圖。正如你可以看到,這些菜單被限制如何使用回收站視圖創建浮動操作按鈕菜單行爲?

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

我曾嘗試在onBindViewHolder添加動畫,但這是爲時已晚。所有項目都在同一時間添加,動畫全部同時發生,而不是按順序發生。想到的唯一想法是將項目逐個添加到適配器,並對notifyDataSet進行更改,但我想挑選社區的大腦來查看是否有更好的方法。這裏是我的適配器

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

這是我如何初始化和將數據發送到我的適配器

LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
    layoutManager.setReverseLayout(true); 
    layoutManager.setStackFromEnd(true); 
    rv.setLayoutManager(layoutManager); 
    mAdapter = new MyAdapter(mContext, mContent); 
    rv.setAdapter(mAdapter); 

我曾嘗試一些其他的事情是控制項目的時間,因爲他們加入。我嘗試使用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)。請注意,您不必從頭開始,它可能足以擴展該頁面上列出的現有子類之一。 – Karakuri

+0

@Karakuri itemAnimator似乎只適用於可滾動項目。所以當我滾動時,滾動時添加的第一個項目上發生的動畫。我需要攔截項目,然後才能添加和綁定。 – portfoliobuilder

+0

我不知道你的意思是「可滾動」的物品。文檔建議可以動畫添加,移動,更改和刪除項目。 – Karakuri

回答

0

對於任何人想知道這是如何可能的,我想出了一個使用處理程序的解決方案。基本上,你想要逐個插入項目。你的處理程序是允許這種情況發生的。

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

將插入方法添加到您的適配器,以便您可以順序地逐個添加項目。

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); 
相關問題