Ich habe eine RecyclerView
, die in einem CardView
ist. Die CardView
hat eine Höhe von 500dp, aber ich möchte diese Höhe verkürzen, wenn die RecyclerView
kleiner ist. Also frage ich mich, ob es einen Listener gibt, der aufgerufen wird, wenn die RecyclerView
ihre Elemente zum ersten Mal abgelegt hat und es möglich macht, die RecyclerView
Höhe auf die CardView
Höhe (wenn kleiner als 500dp) zu setzen.Wie kann man wissen, wann der RecyclerView die Gegenstände abgelegt hat?
Antwort
Ich musste auch Code ausführen, nachdem meine Recycler-Ansicht beendet alle Elemente aufgeblasen. Ich habe versucht, in meinem Adapter onBindViewHolder
einzustecken, wenn die Position die letzte war, und dann den Beobachter benachrichtigt. Zu diesem Zeitpunkt war die Recycleransicht jedoch noch nicht vollständig gefüllt.
Als RecyclerView implementiert ViewGroup
, this anwser war sehr hilfreich. Sie müssen lediglich eine OnGlobalLayoutListener zum recyclerView hinzuzufügen:
View recyclerView=findViewById(R.id.myView);
recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//At this point the layout is complete and the
//dimensions of recyclerView and any child views are known.
}
});
Diese Methode wird mehrmals aufgerufen und nicht nur, wenn es beendet ist. Es funktionierte nicht für mich – Juancho
@Juancho funktioniert es, wenn Sie den Hörer entfernen, nachdem Sie damit auf 'onGlobalLayout' fertig sind? –
@NeonWarge ja es funktioniert das Entfernen des Zuhörers im ersten Anruf, danke! – Juancho
Was für mich gearbeitet wurde den Hörer nach dem Einstellen der RecyclerView Adapter hinzuzufügen.
Dies verwirft den "progressDialog", nachdem sich der globale Layout-Status oder die Sichtbarkeit von Ansichten innerhalb des Ansichtsbaums geändert hat.
Arbeitsmodifikation von @andrino anwser.
Wie @Juancho in Kommentar oben zeigte. Diese Methode wird mehrmals aufgerufen. In diesem Fall möchten wir, dass es nur einmal ausgelöst wird.
Erstellt individuelle Zuhörer mit Instanz zB
private RecyclerViewReadyCallback recyclerViewReadyCallback;
public interface RecyclerViewReadyCallback {
void onLayoutReady();
}
gesetzt Dann OnGlobalLayoutListener
auf RecyclerView
recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (recyclerViewReadyCallback != null) {
recyclerViewReadyCallback.onLayoutReady();
}
recyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
});
nach, dass Sie nur benutzerdefinierte benötigen Zuhörer mit Ihrem Code
recyclerViewReadyCallback = new RecyclerViewReadyCallback() {
@Override
public void onLayoutReady() {
//
//here comes your code that will be executed after all items has are laid down
//
}
};
ich implementieren kämpfte mit dem Versuch,zu entfernensobald es ausgelöst wird, aber das wirft einen IllegalStateException
. Da das, was ich brauche, ist mein recyclerView zum zweiten Element zu bewegen, was ich tat, war zu prüfen, ob es bereits Kinder haben, und wenn es das erste Mal ist das wahr ist, nur dann kann ich die Schriftrolle:
public class MyActivity extends BaseActivity implements BalanceView {
...
private boolean firstTime = true;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
...
ViewTreeObserver vto = myRecyclerView.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (myRecyclerView.getChildCount() > 0 && MyActivity.this.firstTime){
MyActivity.this.firstTime = false;
scrollToSecondPosition();
}
}
});
}
...
private void scrollToSecondPosition() {
// do the scroll
}
}
HTH jemand!
(Natürlich wurde dies auf @andrino und @ Phatee Antworten inspiriert)
Etwas gefunden? Ich brauche es auch wirklich. – Magnas
Related: http://stackoverflow.com/questions/32496681/how-to-know-when-data-is-loaded-inside-custom-recyclerview –