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.
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;
}
}
Ajoutez cette ligne à votre RecyclerView xml:
android:animateLayoutChanges="true"
ça marche pour moi:
animation.setStartOffset(position*100);