2015-07-06 26 views
19

RecyclerView döngüsümü listemin başına dönmeye çalışıyorum.Dairesel (sonsuz) RecyclerView nasıl oluştururum?

İnternet'in her yerini araştırdım ve listemin sonuna geldiğimde bunu tespit ettim, ancak buradan nereye gideceğime emin değilim.

Bu

Şu anda listenin sonunu algılamak için kullanıyorum ne ( here bulundu): sonuna kadar kaydırılan zaman, veri görüntülenirken görünür olmasını görünümleri istiyorum

@Override 
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 

     visibleItemCount = mLayoutManager.getChildCount(); 
     totalItemCount = mLayoutManager.getItemCount(); 
     pastVisiblesItems = mLayoutManager.findFirstVisibleItemPosition(); 

     if (loading) { 
      if ((visibleItemCount+pastVisiblesItems) >= totalItemCount) { 
       loading = false; 
       Log.v("...", ""+visibleItemCount); 
      } 
     } 
} 

listenin en üstünde veya listenin en üstüne kaydırıldığında, listenin alt kısmından veri görüntülerim. Örneğin

:

View1 View2 View3 View4 View5

View5 View1 View2 View3 View4 sonsuz yapmanın bir yolu yoktur, ancak bunu yapmak için bir yol yoktur

+0

@DamianKozlak RecyclerView değil Tabii ListView –

+1

@ChadBingham aynı değildir, ancak bu sorun ListView' 'gibi aynı çözüm kullanarak çözülebileceğini belirtti. 'ListView' ve' RecyclerView' bağdaştırıcıları 'getCount()' ve 'getItem()' yöntemlerini kullanır. –

+0

Bir çözüm buldunuz mu?Ben aynı sorun üzerinde çalışıyorum, şu anda LinearLayoutManager'dan uzanan özel bir LayoutManager yazıyorum düşünüyorum. Hiç amacına ulaştın mı? –

cevap

42

sonsuz gibi gözüküyor. adaptör geçersiz kılma getCount() yılında

  1. Integer.MAX_VALUE gibi büyük bir şey dönmek için: Gerçek öğe sayısına göre

    getItem() ve getView() modülo bölmek
    @Override 
    public int getCount() { 
        return Integer.MAX_VALUE; 
    } 
    
  2. (%) pozisyonu:

    @Override 
    public Fragment getItem(int position) { 
        int positionInList = position % fragmentList.size(); 
        return fragmentList.get(positionInList); 
    } 
    
  3. sonunda, mevcut öğeyi ortadaki bir şeye ayarlayın (ya da sadece aşağı yön).

    // scroll to middle item 
    recyclerView.getLayoutManager().scrollToPosition(Integer.MAX_VALUE/2); 
    
+0

Hey, tam olarak yaptığım şey, ancak negatif değeri olan smoothScrollToPosition() yöntemini arayamıyorum. Listemin dpad kontrollü olmasını ve sol yönün yanı sıra doğru yönde ilerlemesini istiyorum. – anhtuannd

+0

@anhtuannd MAX_INT/2 veya başlangıç ​​konumu ne olursa olsun kullanın. – Tunga

+2

Harika çözüm! Daha iyi anlamak için kod ekledim. :) – Sufian

6

i yeterince bu sorun iş için bulunan diğer çözümler, ama GetCount içinde Integer.MAX_VALUE() recycler bakış yöntemini dönen bazı bellek sorunları olabilir düşünüyorum. Listeden öğeyi almak için pozisyon kullandığınız her yerde Şimdi

@Override 
public int getItemCount() { 
    return itemList == null ? 0 : itemList.size() * 2; 
} 

, Şimdi scrollListener eklemek

position % itemList.size() 

altında kullanın:

Bunu düzeltmek için, getItemCount() aşağıdaki gibi yöntem geçersiz geri dönüşümcünüzün görünümü için bkz.

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
    @Override 
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) 
     super.onScrolled(recyclerView, dx, dy); 
     int firstItemVisible = linearLayoutManager.findFirstVisibleItemPosition(); 
     if (firstItemVisible != 0 && firstItemVisible % itemList.size() == 0) { 
      recyclerView.getLayoutManager().scrollToPosition(0); 
     } 
    } 
}); 

Son olarak otomatik kaydırmayı başlatmak için Düşük

public void autoScroll() { 
    final Handler handler = new Handler(); 
    final Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
      recyclerView.scrollBy(2, 0); 
      handler.postDelayed(this, 0); 
     } 
    }; 
    handler.postDelayed(runnable, 0); 
} 
+0

İyi cevap! Bunu kabul edilene tercih ederim. – Sakiboy

+0

zamanımı kurtardı. –