web-dev-qa-db-fra.com

Comment utiliser ItemAnimator dans une RecyclerView?

Je veux faire de l'animation lorsqu'un élément est ajouté ou supprimé de l'adaptateur de recyclerview. J'essaie d'utiliser RecyclerView.ItemAnimator comme suit mais cela ne fonctionne pas ..

    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

    }

}

J'utilise le code ci-dessus comme suit.

@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); 

}

Chaque fois que j'ajoute un nouvel élément dans l'ensemble de données et appelle mAdapter.notifyDataSetChanged() je m'attendais à ce que le journal soit présent dans animateAdd(ViewHolder arg0) présent dans la classe MyAnimator; mais ça ne vient pas..suis-je manque quelque chose..Pourquoi ça ne fonctionne pas.

19
Harish_N

Tout d'abord, vous n'avez pas besoin d'ItemAnimator personnalisé pour cela. Vous pouvez utiliser celui par défaut, supprimer mRecyclerView.setItemAnimator(animator);

De plus, vous devez utiliser notifyItemInserted() et notifyItemRemoved() au lieu de notifyDataSetChanged(), cela appelle une animation appropriée pour vous.

25
kralex