2016-08-24 107 views
3

我試圖在我的應用程序中動畫我的RecyclerView項目。我想在我的適配器使用此代碼:Animate RecyclerView項目一個接一個

public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position) 
    { 
     myHolder = holder as MyView; 
     if (position > mCurrentPosition) 
     { 
      int currentAnim = Android.Resource.Animation.SlideInLeft; 
      SetAnimation(holder.ItemView, currentAnim); 
      mCurrentPosition = position; 
     } 

    } 

    private void SetAnimation(View view, int currentAnim) 
    { 

     Animation anim = AnimationUtils.LoadAnimation(mContext, currentAnim); 
     anim.SetInterpolator(mContext, Android.Resource.Interpolator.Bounce); 
     view.StartAnimation(anim); 
    } 

然而,因爲我所有的項目一起出現在視圖中創建,而不是當用戶點擊一個按鈕,例如添加,所有項目的動畫一起。

我希望項目按照其位置的順序依次設置動畫。
這可能怎麼做?

回答

2

如何:

public override void OnBindViewHolder(RecyclerView.ViewHolder holder, int position) 
{ 
    myHolder = holder as MyView; 
    if (position > mCurrentPosition) 
    { 
     Handler h = new Handler(); 
     int currentAnim = Android.Resource.Animation.SlideInLeft; 
     Action myAction =() => 
     { 
      SetAnimation(holder.ItemView, currentAnim); 
     }; 

     h.PostDelayed(myAction, 1000); 


     mCurrentPosition = position; 
    } 

} 

更新:如果要進行動畫處理,以便所有的項目,你應該把邏輯代碼出方的適配器。
例如,在活動中,後置適配器RecyleView

List<YourObject> data; // your data list for RecycleView 

    // CALL this code after set adapter for RecycleView 
    Handler h = new Handler(); 
    int currentAnim = Android.Resource.Animation.SlideInLeft; 
    Action myAction =() => 
    {  
     // assume you use LinearLayoutManager for RecyecleView 
     View itemView = linearLayoutManager.findViewByPosition(0); 
     StartAnimation(itemView, 0); 
    }; 

    h.PostDelayed(myAction, 1000); 


    private void StartAnimation(View view, int position) 
    { 

     Animation anim = AnimationUtils.LoadAnimation(mContext, currentAnim); 
     anim.SetInterpolator(mContext, Android.Resource.Interpolator.Bounce); 
     view.StartAnimation(anim); 
     anim.AnimationEnd += (sender, e) => 
     { 
      // animate next item 

      ++position; 
      if (position < data.size()) // data is your array list 
      { 

       // assume you use LinearLayoutManager for RecyecleView 
       View itemView = linearLayoutManager.findViewByPosition(position); 
       if (itemView != null) 
       { 
        StartAnimation(itemView, position); 
       } 
      } 
     } 
    } 
+0

不起作用。它將所有項目一起動畫。 – amitairos

+0

也許是因爲我從一個接一個的代碼中添加我的項目? – amitairos

+0

@amitairos我更新了我的答案。如果您想按順序設置動畫,可以使用我的示例代碼(它可能不起作用,您必須自行檢查)。 – R4j

0

這可能不是答案,但它可能有幫助。我認爲你應該在你的動畫之間設置一個延遲。

new Handler().postDelayed(new Runnable() 
{ 
    @Override 
    public void run() 
    { 
    // your code that you want to delay here 
    } 
}, 1000/* 1000ms = 1sec delay */); 
+0

謝謝,但我使用Xamarin,所以它不適用於我。 – amitairos

0

您需要延遲時間添加到您的動畫和增加延遲每一個項目的綁定。

int delayAnimate = 300; //global variable 

@Override 
public void onBindViewHolder(final MyViewHolder holder, int position) { 
    //set view to INVISIBLE before animate 
    holder.viewAnimate.setVisibility(View.INVISIBLE); 
    setAnimation(holder.ll_root); 
} 

private void setAnimation(final View view) { 
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     public void run() { 
      Animation animation = AnimationUtils.loadAnimation(mContext, android.R.anim.slide_in_left); 
      if(view!=null){ 
       view.startAnimation(animation); 
       view.setVisibility(View.VISIBLE); 
      } 
     } 
    }, delayAnimate); 
    delayAnimate+=300; 
} 
相關問題