web-dev-qa-db-ja.com

RecyclerViewでItemAnimatorを使用するには?

Recyclerviewのアダプターにアイテムが追加または削除されたときにアニメーションを実行したい。私は次のようにRecyclerView.ItemAnimatorを使用しようとしていますが、動作していません。

_    public class MyAnimator extends RecyclerView.ItemAnimator{

    @Override
    public boolean animateAdd(ViewHolder arg0) {
        Log.d("test","Added Animation");
        return false;
    }

    @Override
    public boolean animateChange(ViewHolder arg0, ViewHolder arg1, int arg2, int arg3, int arg4, int arg5) {
        Log.d("test","Change Animation");
        return false;
    }

    @Override
    public boolean animateMove(ViewHolder arg0, int arg1, int arg2, int arg3, int arg4) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean animateRemove(ViewHolder arg0) {
        Log.d("test", "Remove Animation");
        return false;
    }

    @Override
    public void endAnimation(ViewHolder arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void endAnimations() {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean isRunning() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void runPendingAnimations() {
        // TODO Auto-generated method stub

    }

}
_

上記のコードを次のように使用しています。

_@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);

    data=new ArrayList<String>();   


    // use a linear layout manager
    mLayoutManager = new LinearLayoutManager(this);
    mRecyclerView.setLayoutManager(mLayoutManager);

    animator = new MyAnimator();
    mRecyclerView.setItemAnimator(animator);            

    mAdapter = new MyAdapter(data);
    mRecyclerView.setAdapter(mAdapter); 

}
_

データセットに新しいアイテムを追加してmAdapter.notifyDataSetChanged()を呼び出すたびに、MyAnimatorクラスにanimateAdd(ViewHolder arg0)にログが存在することを期待しました。しかし、それは来ていません..私は何かを逃しています..なぜ機能していないのですか?.

19
Harish_N

まず、そのためにカスタムItemAnimatorは必要ありません。デフォルトのものを使用して、mRecyclerView.setItemAnimator(animator);を削除できます

また、notifyItemInserted()の代わりにnotifyItemRemoved()notifyDataSetChanged()を使用する必要があります。これは適切なアニメーションを呼び出します。

25
kralex