2015-04-11 18 views
14

Kaydırma konumunu Recyclerview veya Layoutmanager nasıl edinebilirim?Recyclerview/Layoutmanager'da Kaydırma nasıl elde edilir?

Bir OnScrollListener ekleyerek scrollPosition ölçmek, ancak Yönlendirme scrollDy değiştiğinde gerçekten yok çünkü bunu elde edemez 0.

mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { 
      int scrollDy = 0; 
      @Override 
      public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
       super.onScrollStateChanged(recyclerView, newState); 
      } 

      @Override 
      public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
       scrollDy += dy; 
      } 
     }); 
+3

Sorunuzun kalitesini biraz geliştirebilir misiniz? Cevabınız iyi görünüyor, ancak sorunun daha açık bir şekilde çözüldüğünü belirtmesi gerekiyor. –

+0

Bu https://stackoverflow.com/questions/36568168/how-to-save-scroll-position-of-recyclerview-in-android/36569778#3656977 doğru cevaptır. Bir bak, benim için çalıştı. –

cevap

32

olduğunu olabilir. LayoutManager sadece ekranda görüntülenenleri bilir, önceki görüntülenme sayısını bilmiyor, boyut olarak ne olduğunu vs.

Veriler değiştiğinde kaydırma dinleyicisini kullanabileceğiniz numara güvenilir değil, çünkü RecyclerView yeni bir düzende hesaplama ve gerçek bir ofsetin yeniden hesaplanmaya çalışmaz (görünümler taşındığında onScroll(0, 0) alırsınız).

RecyclerView bu değeri kaydırma çubukları için tahmin eder, aynı yöntemleri View sınıfından da kullanabilirsiniz. computeHorizontalScrollOffset

Bu yöntemler

computeHorizontalScrollRange

computeHorizontalScrollExtent

hem dikey kopyaları bulunmaktadır.

+1

Merhaba yigit tekrar :) Seni son kez gönderen kart adamıyım. Bu yüzden, buradaki görüntüyü ekrana taşımak istiyorum: https://github.com/ksoichiro/Android-ObservableScrollView/blob/master/samples/images/demo12.gif Bunu yukarıdaki yöntemi kullanarak yapabilirim. . Ancak yönelim değiştikten sonra bu alan 0'dır. Güvenilir bir çözüm nasıl görünebilir? Çünkü cevabınız, aynı zamanda, bir kaydırma işinde kaydırma pozisyonunu depolamanın işleri daha iyi yapamayacağını da gösteriyor, doğru mu? – seb

+0

En iyi seçeneğinizin, döndürme sonrasında kaydırma konumunuzu kurtarmak olduğunu düşünüyorum. İlk görünür pozisyonu alabilir ve buna bağlı olarak kaydırma pozisyonunuzu hesaplayabilirsiniz. Ayrıca, mizanpaj yöneticisinin alt öğelerini de geçebilirsiniz, LLM, çocuk konum sırasının adaptör sırasına uygun olacağını garanti eder. Bu bir API garantisi değildir, ancak değiştirilmesi pek mümkün değildir. – yigit

+0

Tüm bu yöntemler, varsayılan uygulama olan 0 döndürüyor gibi görünüyor. Bu yöntemi mizanpaj yöneticisinde uygulamanız bekleniyor. –

0

Daha sonra recyclerView' s kaydırma konumu

+0

bu, öğeler eklendikten/çıkarıldıktan sonra liste kaydırıldığında bu genellikle tetiklenmeyecektir – martyglaubitz

2

Sadece şu anda kaydırılan kalem pozisyon indeksini almak isteyen soruya geldi alabilirsiniz

public void onScrollStateChanged(RecyclerView recyclerView, int newState) 

yılında scrollDy okumak zorunda. istediğiniz diğerleri aynı şeyi için kullanabilirsiniz şunlardır:

LinearLayoutManager myLayoutManager = myRecyclerView.getLayoutManager(); 
int scrollPosition = myLayoutManager.findFirstVisibleItemPosition(); 

Aşağıda belirtilen diğer pozisyonları alabilirsiniz:

  • findLastVisibleItemPosition()
  • findFirstCompletelyVisibleItemPosition()
  • findLastCompletelyVisibleItemPosition()

Bu konuda yardım için this answer'a teşekkürler. Ayrıca kaydırma konumunu nasıl kaydedip geri yükleyeceğinizi gösterir.Aynı activity içinde Fragments arasında geçiş ve yapmak istediğiniz tüm ise ileride kullanılmak için

4

, siz yapabilirsiniz kaydırma-pozisyonrecyclerview için kaydetmek ve daha sonra aynı kaydırma pozisyonuna için recyclerview geri aşağıdaki gibidir: geri arama daha uygundur ne olursa olsun onStop()/onDestroyView()/onPause() yılında

bunu yapmak:

Parcelable recylerViewState = recyclerView.getLayoutManager().onSaveInstanceState(); 

Veyılındadaha uygun ne olursa olsun geri arama Bunu yapmak:

recyclerView.getLayoutManager().onRestoreInstanceState(recylerViewState); 

Bu şekilde başarılı bir parcelable içinde recyclerView's devlet tutmak ve istediğiniz zaman geri yükleyebilirsiniz.

İlgili konular