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; 
} 
相关问题