Как настроить анимацию ввода для элементов RecyclerView? - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь установить входную анимацию для всех элементов 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;
    }

}
...