RecyclerView: comment créer l'effet d'animation insert?

j'ai un ReyclerView travaillant avec un LinearLayoutManager et un Adapter<ViewHolder> . J'ai une liste d'articles que j'aimerais afficher dans le recyclerview avec l'animation insert (slide in). Comment puis-je aller à ce sujet ?

je voudrais afficher les animations avec un délai de croissance linéaire basé sur l'index de l'article.

Actuellement, si j'utilise 2 boutons "ajouter" et "supprimer", puis effectuez les opérations respectives sur le recyclerview ( notifyItemInserted() et notifyItemRemoved() , les animations arrivent bien.

si j'effectue une boucle programmée sur le jeu de données et ajoute les éléments, encore une fois, en utilisant notifyItemInserted() , Je ne vois aucune animation. Je vois juste tous les articles apparaître presque à la fois.

si J'utilise Asynctasks avec un retard linéaire, et puis Ajouter/Supprimer l'article dans OnPostExecute() , Je ne vois toujours pas d'animation. Aussi, je vois une possibilité de tomber dans des blocages si plusieurs threads d'insertion attendent tous suppriment les threads à compléter (sans place pour l'exécution des threads).

Qu'est-ce que je fais de mal ?

j'ai passé en revue la plupart des questions liées à cela sur SO et j'ai passé des jours à fouiner autour de la partie animation de la recyclerview, toujours pas de chance.

5
demandé sur Marcus 2015-03-11 15:09:13

3 réponses

Voici comment j'ajoute une animation dans mon Adapter . Cela va animer un effet de poussée, avec la ligne venant de la droite.

définissez D'abord l'animation en xml ( res/anim/push_left_in.xml )

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="100%p" android:toXDelta="0"
        android:duration="300"/>
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
        android:duration="300" />
</set>

puis réglez - le dans votre adaptateur comme suit

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row;
    if (convertView == null) {
        LayoutInflater inflater = LayoutInflater.from(getContext());
        row = inflater.inflate(R.layout.music_list_item, null);
    } else {
        row = convertView;
    }

    ...

    //Load the animation from the xml file and set it to the row
    Animation animation = AnimationUtils.loadAnimation(getContext(), R.anim.push_left_in);
    animation.setDuration(500);
    row.startAnimation(animation);

    return row;
}

Cette animation sera affiché chaque fois que vous ajoutez une nouvelle ligne, il devrait fonctionner dans votre cas.

Modifier

Voici comment vous pouvez ajouter une animation en utilisant un RecyclerView

@Override
public void onBindViewHolder(ViewHolder holder, int position)
{
    holder.text.setText(items.get(position));

    // Here you apply the animation when the view is bound
    setAnimation(holder.container, position);
}

/**
 * Here is the key method to apply the animation
 */
private void setAnimation(View viewToAnimate, int position)
{
    // If the bound view wasn't previously displayed on screen, it's animated
    if (position > lastPosition)
    {
        Animation animation = AnimationUtils.loadAnimation(context, android.R.anim.push_left_in);
        viewToAnimate.startAnimation(animation);
        lastPosition = position;
    }
}
9
répondu Marcus 2015-03-11 13:56:39

Ajoutez cette ligne à votre RecyclerView xml:

android:animateLayoutChanges="true"

4
répondu penduDev 2016-03-06 13:58:22

ça marche pour moi:

animation.setStartOffset(position*100);
2
répondu user2852741 2016-03-06 19:25:11