2016-03-07 8 views
8

'u başlatırken en üste kaydır, resim galerim için StaggeredGridLayoutManager kullanıyorum. Resimlerin en altta yığılması için setReverseLayout(true)'u ayarladık.Android: StaggeredGridLayoutManager,

Karşılaştığım sorun, uygulamanın başlatılmasında, galerinin altındaki kaydırma noktalarıdır. Kullanıcının uygulamayı ilk başlatması durumunda, kaydırmanın galerinin en üstünde olmasını isterdim.

scrollToPosition (aşağıdaki kod parçacığını) kullanmayı denedim, ancak kaydırma işlemi galeri ortasında bir yerde biter, muhtemelen resimler scrollToPosition numaralı çağrı sırasında düzgün şekilde yüklenmediğinden.

mLayoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL); 
    mLayoutManager.setReverseLayout(true); 

mRecyclerView.setLayoutManager(mLayoutManager); 
mImageList = ((MainActivity)getActivity()).getImages(); 
adapter = new ImageAdapter(getActivity(),mImageList); 
mRecyclerView.setAdapter(adapter); 
mRecyclerView.scrollToPosition(mImageList.size()-1); 

Kaydırma, altta değil de üstte işaret etmenin uygun bir yolu var mı?

cevap

2

Daha önce benzer sorunu çözdü ve yöntemdir uyana kadar yukarı kaydır Ser dokunur. Umarım bu size yardımcı olabilir.

+0

ekrana dokunduğumda çalışır, ancak dokunmadığımda hiçbir şey görünmez. Kullanıcıya dokunmak zorunda olmadığı varsayılan olarak onu kaydırmak istiyorum. Bu en yakın cevabı bu yüzden senin için ödül vereceğim. btw cevabım istediğim gibi çalışıyor. – uguboz

1

+0

: Bu sistemi kullanarak, OnScrollListener uzanır kendi sınıfını yaratan tarafından en kullanım durumlarını destekleyen bir temel EndlessScrollListener tanımlayabilirsiniz. İlk görünür öğe her zaman son öğe olmaz. Bu yüzden farklı koşularda farklı pozisyonlara kaymayı bitirebilirim. – Neo

0

scrollToPositionWithOffset() fonksiyonu kullanılarak deneyin findFirstCompletelyVisibleItemPositions

veya findFirstVisibleItemPositions

önceki yöntem (ler) den elde edilen pozisyonu ile geri dönüşüm olarak adlandırdığımız scrollToPosition çağırarak ilk görünür konumunu bulmak deneyin Bunun yerine StaggeredGridLayoutManager. Onu scrollToPosition'dan daha güvenilir buldum. Ayrıca bu işlevi Handler().post() içinde uyguladığınızdan emin olun. Bu, ileti sırasına Runnable eklenmesine neden olur. UI iş parçacığı serbest olduğunda çalışır.

new Handler().post(new Runnable() { 
      @Override 
      public void run() { 
       staggeredGridLayoutManager.scrollToPositionWithOffset(mImageList.size() - 1, 0); 
      } 
     }); 
+0

Maalesef benim için çalışmadı. Thansk cevap için – uguboz

1

Ben dataobserver iç scrolltoposition kullanılan ve şimdi .. gayet iyi çalışıyor

recyclerview yükler, üst ürün aşağıdaki kodu ile görülebilir

:

rcAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { 
      @Override 
      public void onItemRangeInserted(int positionStart, int itemCount) { 
       super.onItemRangeInserted(positionStart, itemCount); 
       int count = rcAdapter.getItemCount(); 
       mRecyclerView.scrollToPosition(itemCount-1); 

      } 
     }); 

altına kaydırmak için Sohbet görünümünde yeni eklenen öğeler için aşağıdaki kodu kullanın.

mRecyclerView.getViewTreeObserver().addOnGlobalLayoutListener(
       new ViewTreeObserver.OnGlobalLayoutListener() { 
        @SuppressWarnings("deprecation") 
        @Override 
        public void onGlobalLayout() { 
         ViewTreeObserver observer = mRecyclerView.getViewTreeObserver(); 
         scrollRecyclerViewToTop(); 
         if (!observer.isAlive()) { 
          return; 
         } 
         if (mScrolledByUser) { 
          if (hasJellyBeanApi()) { 
           observer.removeOnGlobalLayoutListener(this); 
          } else { 
           observer.removeGlobalOnLayoutListener(this); 
          } 
         } 
        } 
       }); 

Ve:

Ve:

private void scrollRecyclerViewToTop() { 
    mRecyclerView.scrollToPosition(0); 
    mRecyclerView.scrollBy(0, Integer.MIN_VALUE); 
} 

anlamı kolaydır: Her zaman RecyclerView let burada

 rcAdapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { 
        @Override 
        public void onItemRangeInserted(int positionStart, int itemCount) { 
         super.onItemRangeInserted(positionStart, itemCount); 
         int count = rcAdapter.getItemCount(); 
         int lastVisiblePositions[] = new int[2]; //for 2 columns 
         int lastVisiblePosition = staggeredGridLayoutManager.findLastCompletelyVisibleItemPositions(lastVisiblePositions)[0]; 
         // If the recycler view is initially being loaded or the user is at the bottom of the list, scroll 
         // to the bottom of the list to show the newly added message. 
         if (lastVisiblePosition == -1 || 
          (positionStart >= (count- 1) && lastVisiblePosition == (positionStart - 1))) { 
          mRecyclerView.scrollToPosition(positionStart); 
         } 

        } 
       }); 
+0

İlginç görünüyor. – Neo

0

Bu kod size yardımcı olabilir, ben de desteği her tetiklenen OnScrollListener olaylara bağlayan kodda bu bağlantıyı

https://guides.codepath.com/android/Endless-Scrolling-with-AdapterViews-and-RecyclerView

Her AdapterView (örneğin ListView ve GridView) olmuştur kullanılan Bir Kullanıcı koleksiyonda ilerler.sorunu tamamen çözmez

public abstract class EndlessScrollListener implements AbsListView.OnScrollListener { 
    // The minimum number of items to have below your current scroll position 
    // before loading more. 
    private int visibleThreshold = 5; 
    // The current offset index of data you have loaded 
    private int currentPage = 0; 
    // The total number of items in the dataset after the last load 
    private int previousTotalItemCount = 0; 
    // True if we are still waiting for the last set of data to load. 
    private boolean loading = true; 
    // Sets the starting page index 
    private int startingPageIndex = 0; 

    public EndlessScrollListener() { 
    } 

    public EndlessScrollListener(int visibleThreshold) { 
     this.visibleThreshold = visibleThreshold; 
    } 

    public EndlessScrollListener(int visibleThreshold, int startPage) { 
     this.visibleThreshold = visibleThreshold; 
     this.startingPageIndex = startPage; 
     this.currentPage = startPage; 
    } 

    // This happens many times a second during a scroll, so be wary of the code you place here. 
    // We are given a few useful parameters to help us work out if we need to load some more data, 
    // but first we check if we are waiting for the previous load to finish. 
    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) 
    { 
     // If the total item count is zero and the previous isn't, assume the 
     // list is invalidated and should be reset back to initial state 
     if (totalItemCount < previousTotalItemCount) { 
      this.currentPage = this.startingPageIndex; 
      this.previousTotalItemCount = totalItemCount; 
      if (totalItemCount == 0) { this.loading = true; } 
     } 
     // If it's still loading, we check to see if the dataset count has 
     // changed, if so we conclude it has finished loading and update the current page 
     // number and total item count. 
     if (loading && (totalItemCount > previousTotalItemCount)) { 
      loading = false; 
      previousTotalItemCount = totalItemCount; 
      currentPage++; 
     } 

     // If it isn't currently loading, we check to see if we have breached 
     // the visibleThreshold and need to reload more data. 
     // If we do need to reload some more data, we execute onLoadMore to fetch the data. 
     if (!loading && (firstVisibleItem + visibleItemCount + visibleThreshold) >= totalItemCount) { 
     loading = onLoadMore(currentPage + 1, totalItemCount); 
     } 
    } 

    // Defines the process for actually loading more data based on page 
    // Returns true if more data is being loaded; returns false if there is no more data to load. 
    public abstract boolean onLoadMore(int page, int totalItemsCount); 

    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
     // Don't take any action on changed 
    } 
    }