2015-05-22 23 views
22

CardView'un içinde bulunan bir RecyclerView var. CardView, 500dp'lik bir yüksekliğe sahiptir, ancak RecyclerView daha küçükse bu yüksekliği kısaltmak istiyorum. RecyclerView, öğelerini ilk kez bırakmayı tamamladığında çağrılan herhangi bir dinleyici olup olmadığını merak ederek, 'yüksekliğini (500dp'den küçükse) CardView uzunluğuna ayarlamak mümkündür.RecyclerView öğelerin bırakılmasını tamamladığında nasıl bilinir?

+0

şey buldunuz? Buna gerçekten ihtiyacım var. – Magnas

+0

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

cevap

29

Ben de rehabilitasyon makinesi görünümü tüm elemanları şişirmek bittikten sonra kod çalıştırmak için gerekli. Adaptörümde onBindViewHolder numaralı telefonu kontrol etmeyi denedim, eğer konum sonuncuyduysa ve ardından gözlemciye bildirildi. Fakat bu noktada, geri dönüşümcü görünümü hala tam olarak doldurulmadı. RecyclerView, ViewGroup gereğince this anwser çok yardımcı oldu. Sadece recyclerView bir OnGlobalLayoutListener eklemek gerekir: benim için çalıştı Ne

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

bu yöntem değil Bittikten sadece birkaç kez denir. Benim için işe yaramadı – Juancho

+5

@Juancho, "onGlobalLayout" ile bittikten sonra dinleyiciyi kaldırırsanız işe yarar mı? –

+3

@NeonWarge evet, ilk çağrıda dinleyiciyi kaldırmaya çalışıyor, teşekkürler! – Juancho

-2

RecyclerView adaptörü ayarladıktan sonra dinleyici eklemek oldu.

ServerRequest serverRequest = new ServerRequest(this); 
serverRequest.fetchAnswersInBackground(question_id, new AnswersDataCallBack() 
{ 
    @Override 
    public void done(ArrayList<AnswerObject> returnedListOfAnswers) 
    { 
     mAdapter = new ForumAnswerRecyclerViewAdapter(returnedListOfAnswers, ForumAnswerActivity.this); 
     recyclerView.setAdapter(mAdapter); 
     recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() 
     { 
      @Override 
      public void onGlobalLayout() 
      { 
       progressDialog.dismiss(); 
      } 
     }); 
    } 
}); 

Bu

küresel düzen devlet veya görünüm ağaç değişiklikleri içindeki görünümlerin görünürlüğü sonra "progressDialog" reddeder. @andrino anwser ait

15

Çalışma modifikasyon.

@Juancho yukarıdaki yorumunda belirttiği gibi. Bu yöntem birkaç kez denir. Bu durumda sadece bir kez tetiklenmesini istiyoruz. örnek ile örn

düzenlendi özel dinleyici

private RecyclerViewReadyCallback recyclerViewReadyCallback; 

public interface RecyclerViewReadyCallback { 
    void onLayoutReady(); 
} 

O halde tek ben

recyclerViewReadyCallback = new RecyclerViewReadyCallback() { 
      @Override 
      public void onLayoutReady() { 
       // 
       //here comes your code that will be executed after all items has are laid down 
       // 
      } 
}; 
1

sizin koduyla özel dinleyici uygulamak gerek bundan sonra senin RecyclerView

recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
      @Override 
      public void onGlobalLayout() { 
       if (recyclerViewReadyCallback != null) { 
        recyclerViewReadyCallback.onLayoutReady(); 
       } 
       recyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      } 
     }); 

üzerinde OnGlobalLayoutListener setkaldırmaya çalışırken ile mücadelebir kez tetiklendiğinde, bu bir IllegalStateException atar. ne gerek zaten çocuk sahibi olmadığını kontrol etmek ne yaptım ikinci elemana benim recyclerView kaydırmak için olduğunu ve bu doğrudur ilk kez ise, ancak o zaman ben kaydırma yapmak beri:

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 birisi!

(Elbette, bu @andrino ve @Phatee yanıtlara ilham)