1

Я создаю приложение, используя новый API 21 (Lollipop). Я настраиваю анимацию slide_in_left на recyclerview для просмотра карты 1 на 1, но когда появятся элементы, они сойдутся вместе, и я хочу, чтобы они скользят влево 1 1 и 2 я анимация панели инструментов, чтобы скрыть/показать свою работу, но проблема в том, когда я прокручиваю вверх и когда recyclerview останавливается, тогда он будет скрываться и в том же случае, когда прокрутка вниз, я хочу скрыть/показать панель инструментов, когда свиток начинает меня помогать. Заранее спасибоКак настроить анимацию на recyclerview

belowis Myadapter класс для recyclerview анимации

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

private ArrayList<PersonData> peopleDataSet; 
private Context context; 
View view; 
public static class MyViewHolder extends RecyclerView.ViewHolder { 

    TextView textViewName; 
    TextView textViewEmail; 
    ImageView imageViewIcon; 

    public MyViewHolder(View itemView) { 
     super(itemView); 
     this.textViewName = (TextView) itemView.findViewById(R.id.textViewName); 
     this.textViewEmail = (TextView) itemView.findViewById(R.id.textViewEmail); 
     this.imageViewIcon = (ImageView) itemView.findViewById(R.id.imageView); 
    } 
} 

public MyAdapter(ArrayList<PersonData> people,Context context) { 
    this.peopleDataSet = people; 
    this.context=context; 
} 

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, 
             int viewType) { 
    view = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.cards_layout, parent, false); 

    view.setOnClickListener(MainActivity.myOnClickListener); 
    setAnimation(view); 
    MyViewHolder myViewHolder = new MyViewHolder(view); 
    return myViewHolder; 
} 

@Override 
public void onBindViewHolder(final MyViewHolder holder, final int listPosition) { 

    TextView textViewName = holder.textViewName; 
    TextView textViewEmail = holder.textViewEmail; 
    ImageView imageView = holder.imageViewIcon; 

    textViewName.setText(peopleDataSet.get(listPosition).getName()); 
    textViewEmail.setText(peopleDataSet.get(listPosition).getEmail()); 
    imageView.setImageResource(peopleDataSet.get(listPosition).getImage()); 

} 

@Override 
public int getItemCount() { 
    return peopleDataSet.size(); 
} 
/** 
* Here is the key method to apply the animation 
*/ 
private void setAnimation(View viewToAnimate) 
{ 
    // If the bound view wasn't previously displayed on screen, it's animated 
    Animation animation = AnimationUtils.loadAnimation(context, android.R.anim.slide_in_left); 
     viewToAnimate.startAnimation(animation); 

} 

ниже код панели инструментов

@SuppressLint("NewApi") @Override 
     public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 

      super.onScrolled(recyclerView, dx, dy); 

      if (dy > 0) { 
       toolbar.animate() 
         .translationY(-toolbar.getBottom()) 
         .setInterpolator(new AccelerateInterpolator()) 
         .start(); 



      } else { 

       toolbar.animate() 
         .translationY(0) 
         .setInterpolator(new AccelerateInterpolator()) 
         .start(); 


      } 

ответ

3

К сожалению, RecyclerView не поддерживает анимацию при прокрутке с RecyclerView.ItemAnimator.

Если вы хотите создать по одному анимации элементов RecyclerView, вы должны оживить каждый viewHolder.itemView внутри метода onBindView. Отслеживание последней анимированной позиции важно, чтобы избежать анимации при прокрутке вниз, если только это не ваше намерение.

Вот простой альфа-анимации я сделал:

public interface RecyclerViewItemOnScrollAnimator { 
    public void onAnimateViewHolder(RecyclerView.ViewHolder viewHolder, int position); 
    public void onPrepareToAnimateViewHolder(RecyclerView.ViewHolder viewHolder); 
} 

Вот реализация Animator (вроде, не мог придумать лучшего названия)

public class RecyclerViewScrollAnimator implements RecyclerViewItemOnScrollAnimator{ 
    private final LinearLayoutManager mLayoutManager; 
    private final RecyclerView mRecyclerView; 
    private final Interpolator mInterpolator; 
    int mLastAnimatedPosition = RecyclerView.NO_POSITION; 

    public RecyclerViewScrollAnimator(RecyclerView recyclerView) { 
     mLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); 
     mRecyclerView = recyclerView; 
     mInterpolator = InterpolatorUtil.loadInterpolator(recyclerView.getContext()); 
    } 

    @Override 
    public void onAnimateViewHolder(RecyclerView.ViewHolder viewHolder, int position) { 
     onPrepareToAnimateViewHolder(viewHolder); 
     if(shouldAnimateOrPrepare(position)){ 
      ViewCompat.animate(viewHolder.itemView) 
        .alpha(1) 
        .setInterpolator(mInterpolator) 
        .setDuration(300).start(); 
     } 
     mLastAnimatedPosition = position; 
    } 

    private boolean shouldAnimateOrPrepare(int position) { 
     return mLastAnimatedPosition == RecyclerView.NO_POSITION || mLastAnimatedPosition < position; 
    } 

    @Override 
    public void onPrepareToAnimateViewHolder(RecyclerView.ViewHolder viewHolder) { 
    // do some stuff if needed before animation 
    if(shouldAnimateOrPrepare(position)){ 
     ViewCompat.setAlpha(viewHolder.itemView, 0); 
    } 
    } 
    //clear animation if needed 
    private void cancelAnimationAt(int position) { 
     RecyclerView.ViewHolder v = mRecyclerView.findViewHolderForPosition(position); 
     if(!isVisible(position) || v != null){ 
      if(v != null) { 
       Log.i("cancelAnimationAt", " canceling "+position); 
       //cancelAnimation(v.itemView); 
      } 
     } 

    } 

    private void cancelAnimation(View v) { 
     if(v != null) { 
     v.clearAnimation(); 
     v.setAnimation(null); 
     ViewCompat.animate(v).cancel(); 
     } 
    } 

    private boolean isVisible(int position){ 
     return position >= mLayoutManager.findFirstVisibleItemPosition() && position <= mLayoutManager.findLastVisibleItemPosition(); 
    } 

} 

А вот как вы используйте его в своем RecyclerView.Adapter

@Override 
    public void onBindViewHolder(RecyclerView.ViewHolder vh, int position) { 
     if(getItemViewType(position) == VIEW_TYPE_ITEM) { 
      bindItem(vh, position-1); // position only if no header otherwise position-1 
      mRecyclerViewAnimator.onAnimateViewHolder(vh, position); 
     } 
     else return; // don't bind the header 
    } 

Теперь вы должны изменить код внутри onAnimateViewHolder(), чтобы использовать ваш ресурс анимации. Это тривиально.

На вашем Toolbar toggling я предлагаю вам использовать это library. У этого есть действительно удобные обратные вызовы прокрутки для Вашей цели.

+3

Вместо onBind вы должны использовать 'onViewAttachedToWindow'. RecyclerView не будет перепроверять элемент, если он кэширован и действителен. – yigit

Смежные вопросы