2017-04-07 2 views
1

Ich habe eine spezielle Animation, die die Karten für meine RecyclerView bevölkert. Die Animation funktioniert gut (zumindest zum Aufblasen). Ich möchte nicht, dass diese Animation nach der ersten Inflation verwendet wird. Mit anderen Worten, ich möchte keine Animation zum Scrollen (oder wirklich irgendeine Aktion durch den Benutzer nach dem anfänglichen Aufblasen von genügend Karten, um den Bildschirm des Benutzers zu füllen). Ich kann nicht herausfinden, wie ich die Positionsnummer erfassen soll - oder - nach dem Auffüllen die Animation ausschalten - oder eine andere Möglichkeit, dies zu tun. Meine Animation wird im Adapter aufgerufen. Hier ist der Adaptercode, den ich verwende, um die Animation einzustellen.Stop Animation nach Recyclerview bläst Bildschirm

public class TagAdapter extends RecyclerView.Adapter<TagAdapter.ViewHolder>{ 
private ArrayList<TagDataModel> dataSet; 
private Context context; 

public TagAdapter (ArrayList<TagDataModel> ds, Context ctx){ 
    this.dataSet =ds; 
    this.context =ctx; 
} 

class ViewHolder extends RecyclerView.ViewHolder { 
    TextView tv_tag; 
    ArrayList<TagDataModel> dataSet = new ArrayList<>(); 
    Context context; 
    CardView card; 

    ViewHolder(View itemView, Context ctx, ArrayList<TagDataModel> ds) { 
     super(itemView); 
     this.dataSet = ds; 
     this.context =ctx; 
     this.tv_tag = (TextView) itemView.findViewById(R.id.tv_cardTag); 
     this.card = (CardView) itemView.findViewById(R.id.card_view_tag); 
    } 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_tag, parent, false); 
    ViewHolder viewHolder = new ViewHolder(view, context, dataSet); 
    return viewHolder; 
} 

@Override 
public void onBindViewHolder(final ViewHolder holder, @SuppressLint("RecyclerView") final int position) { 
    final int activePosition = context.getSharedPreferences("userPrefs", Context.MODE_PRIVATE).getInt("np_tag", 0); 
    TextView tv_tag = holder.tv_tag; 
    CardView card = holder.card; 
    tv_tag.setText(dataSet.get(position).getTag()); 

    }); 
    animate(holder.itemView, position); //animate only first page UPDATE 
} 

@Override 
public int getItemCount() { 
    return dataSet.size(); 
} 

private void animate(View view, final int pos) { 
    view.animate().cancel(); 
    view.setTranslationY(100); 
    view.setAlpha(0); 
    view.animate().alpha(1.0f).translationY(0).setDuration(300).setStartDelay(pos *100); 
} 

Antwort

0

Entfernen Sie Ihre aktuelle Animation von bindViewHolder und Verwendung benutzerdefinierte ItemAnimator und animateAdd Methode außer Kraft setzen. Sie finden mehr here

Dies sollte Ihnen das gewünschte Ergebnis geben.

public class MyItemAnimator extends DefaultItemAnimator { 

@Override 
    public boolean animateAdd(ViewHolder viewHolder) { 
     animate(viewHolder.itemView); 
     return true; 
    } 

private void animate(View view) { 
    view.setTranslationY(100); 
    view.setAlpha(0); 
    view.animate().alpha(1.0f).translationY(0).setDuration(300); 
} 


} 

Setzen Sie diesen Objektanimator jetzt auf Ihre Recycleransicht.

recyclerView.setItemAnimator (neu MyItemAnimator());

Try this :)

+0

Ich glaube, dieser Link sagt mir, wie man die Animation beendet. Ich kann das, aber ich muss wissen, wie man Animation * nach der Inflation beendet *. Das ist der schwierige Teil für mich. – seekingStillness

+0

Es wird nur auf die Inflation und nicht danach animieren. –

+0

Danke, ich werde es versuchen! – seekingStillness

0

Es wäre hilfreich, wenn Sie den Code von Activity an, wo Sie diese RecyclerView verwenden. Wie auch immer, this answer wird Ihnen helfen zu erkennen, ob Ihr RecyclerView das letzte Element erreicht hat oder nicht.
Und this answer wird Ihnen helfen zu erkennen, ob Ihr Layout vollständig erstellt/aufgeblasen ist.

+0

Ich möchte nicht auf den letzten Gegenstand zielen, ich möchte RecyclerView zielen * fertig aufgeblasen *. Dies wird eine viel kleinere Zahl sein. – seekingStillness

+0

Ihre Anforderung besteht darin, die Animation zu starten, wenn 'RecyclerView' anfängt, erstellt/aufgeblasen zu werden und die Animation zu stoppen, wenn sie fertig ist. Habe ich recht? Um zu verstehen, was Sie gerade mit 'RecyclerView' machen, müssen Sie auch den Code angeben, wo Sie diese RecyclerView verwenden (dh Ihre' Aktivität'). –

+0

Wie auch immer, [diese Antwort] (http: //stackoverflow.com/a/31854673/2788613) könnte noch helfen. Dies enthält einen Listener, der aufgerufen wird, wenn das Layout vollständig geladen/aufgeblasen ist. –