Я пытаюсь установить входную анимацию для всех элементов RecyclerView программно, когда она появляется.
Я могу успешно анимировать, используя файл анимации XML:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
recycler.layoutManager = LinearLayoutManager(this)
recycler.adapter = MyAdapter()
recycler.layoutAnimation = AnimationUtils.loadLayoutAnimation(this, R.anim.layout_animation_from_right)
//recycler.itemAnimator = SimpleItemAnimator()
recycler.adapter!!.notifyDataSetChanged()
recycler.scheduleLayoutAnimation()
}
}
Это решение работает отлично,но мне нужно установить анимацию, используя расширение класса DefaultItemAnimator.
Для этой цели я создал класс SimpleItemAnimator и переопределил его метод animateApperance:
public class SimpleItemAnimator extends DefaultItemAnimator {
@Override
public boolean animateAppearance(@NonNull RecyclerView.ViewHolder viewHolder, @Nullable ItemHolderInfo preLayoutInfo, @NonNull ItemHolderInfo postLayoutInfo) {
Log.d("AnimationTag", "animateApperance");
final MyAdapter.SampleViewHolder holder = (MyAdapter.SampleViewHolder) viewHolder;
ObjectAnimator animator = ObjectAnimator.ofFloat(holder.mTextView, View.TRANSLATION_X, 0, holder.mTextView.getWidth() / 2);
animator.setDuration(2000);
animator.start();
return super.animateAdd(viewHolder);
}
}
Затем я установил его в RecyclerView:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
recycler.layoutManager = LinearLayoutManager(this)
recycler.adapter = MyAdapter()
// recycler.layoutAnimation = AnimationUtils.loadLayoutAnimation(this, R.anim.layout_animation_from_right)
recycler.itemAnimator = SimpleItemAnimator()
recycler.adapter!!.notifyDataSetChanged()
recycler.scheduleLayoutAnimation()
}
}
В результате элементы не анимированы, и в логах я не могу найти «animateApperance», что означает, что этот метод не вызывается.
Мой вопрос: как программно анимировать элементы RecyclerViewиспользуя DefaultItemAnimator?
Кстати, это код MyAdapter:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.SampleViewHolder> {
static class SampleViewHolder extends RecyclerView.ViewHolder {
public TextView mTextView;
public SampleViewHolder(TextView textView) {
super(textView);
mTextView = textView;
}
}
@NonNull
@Override
public SampleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
TextView textView = (TextView) LayoutInflater.from(parent.getContext()).inflate(R.layout.listitem, parent, false);
return new SampleViewHolder(textView);
}
@Override
public void onBindViewHolder(@NonNull SampleViewHolder sampleViewHolder, int i) {
sampleViewHolder.mTextView.setText("item "+i);
}
@Override
public int getItemCount() {
return 5;
}
}