2015-05-22 4 views
22

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?

+0

Etwas gefunden? Ich brauche es auch wirklich. – Magnas

+0

Related: http://stackoverflow.com/questions/32496681/how-to-know-when-data-is-loaded-inside-custom-recyclerview –

Antwort

29

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. 
       } 
      }); 
+13

Diese Methode wird mehrmals aufgerufen und nicht nur, wenn es beendet ist. Es funktionierte nicht für mich – Juancho

+5

@Juancho funktioniert es, wenn Sie den Hörer entfernen, nachdem Sie damit auf 'onGlobalLayout' fertig sind? –

+3

@NeonWarge ja es funktioniert das Entfernen des Zuhörers im ersten Anruf, danke! – Juancho

-2

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.

15

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 
       // 
      } 
}; 
1

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)

Verwandte Themen