2015-04-05 3 views
6

ich diesen Code haben:findFirstVisibleItemPositions funktioniert nicht für recycleview android

mRecycleView.setOnScrollListener(new RecyclerView.OnScrollListener() { 
    @Override 
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
     super.onScrolled(recyclerView, dx, dy); 
     int[] firstVisibleItemPositions = new int[getResources().getInteger(R.integer.news_numbers_column)]; 
     int pastVisiblesItems = ((StaggeredGridLayoutManager)getLayoutManager()).findFirstVisibleItemPositions(firstVisibleItemPositions)[0]; 
    } 
}); 

Wenn ich meine recycleview bewegen bekomme ich diesen Fehler:

java.lang.NullPointerException: Attempt to invoke virtual method 'int android.support.v7.widget.OrientationHelper.getStartAfterPadding()' on a null object reference 
at android.support.v7.widget.StaggeredGridLayoutManager$Span.findOneVisibleChild(StaggeredGridLayoutManager.java:2177) 
at android.support.v7.widget.StaggeredGridLayoutManager$Span.findFirstVisibleItemPosition(StaggeredGridLayoutManager.java:2153) 
at android.support.v7.widget.StaggeredGridLayoutManager.findFirstVisibleItemPositions(StaggeredGridLayoutManager.java:806) 
at info.lanouvelletribune.apps.android.ui.fragments.NewsFragment$1.onScrollStateChanged(NewsFragment.java:90) 
at android.support.v7.widget.RecyclerView.setScrollState(RecyclerView.java:751) 
at android.support.v7.widget.RecyclerView.onInterceptTouchEvent(RecyclerView.java:1535) 
at com.github.ksoichiro.android.observablescrollview.ObservableRecyclerView.onInterceptTouchEvent(ObservableRecyclerView.java:188) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2060) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173) 
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2431) 
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2173) 
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2390) 
at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1741) 
at android.app.Activity.dispatchTouchEvent(Activity.java:2826) 
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2351) 
at android.view.View.dispatchPointerEvent(View.java:8590) 
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4098) 
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3964) 
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3488) 
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3541) 
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3507) 
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3515) 
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3488) 
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3541) 
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3507) 
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3617) 
at android 

Wie kann ich diesen Fehler zu behandeln tun und erhalten die erste sichtbare Position?

+0

Ich denke mal Es geschieht bei der allerersten Initialisierung. Prüfen Sie vor dem Aufruf von findFirstVisible, ob Kinder vorhanden sind, und es wäre auch nett, wenn Sie einen Fehlerbericht auf b.android.com erstellen könnten. – yigit

Antwort

14

ich es mit diesem Code getestet und es funktioniert gut mit mir

int positionView = ((LinearLayoutManager)recyclerView.getLayoutManager()).findFirstVisibleItemPosition(); 

ich das Papier Ansicht Parameter verwendet.

+0

sehr nette antwort –

+0

du hast mich gerettet, cool! –

3

Try this:

int position = layoutManager.findFirstVisibleItemPositions(null)[0]; 

wo layoutManager ist, was Sie setzen in Ihrem recyclerview.

Zum Beispiel

layoutManager = new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL); 
mrecyclerView.setLayoutManager(layoutManager); 
+0

diese Lösung hat für mich funktioniert. Bitte sagen Sie mir, wenn in der Lösung etwas nicht stimmt. layoutManager.findFirstVisibleItemPositions (null) gibt ein neues Array zurück. [Link] (https://developer.android.com/reference/android/support/v7/widget/StaggeredGridLayoutManager.html#findFirstVisibleItemPositions (int [])) –

0

ein Fehler in der RecyclerView StaggeredGridLayoutManager Dies ist:

https://code.google.com/p/android/issues/detail?id=180521

https://code.google.com/p/android/issues/detail?id=181461

Eine Abhilfe, die Ausnahme zu try/catch ist:

try { 
    ((StaggeredGridLayoutManager)getLayoutManager()).findFirstVisibleItemPositions(firstVisibleItemPositions); 
} catch (NullPointerException ex) { 
    // workaround for RecyclerView bug. assume not laid out, so no items visible 
    firstVisibleItemPositions[0] = RecyclerView.NO_POSITION; 
    firstVisibleItemPositions[1] = RecyclerView.NO_POSITION; 
} 
0

können Sie verwenden:

int[] firstVisibleItemPositions = new int[yourNumberOfColumns]; 
int pastVisiblesItems = layoutManager.findFirstVisibleItemPositions(firstVisibleItem‌​Positions)[0]; 
0

Wenn Sie StaggeredGridLayoutManager verwenden Sie findLastVisibleItemPositions wie hier finden können:

int visibleThreshold =1; 
final StaggeredGridLayoutManager linearLayoutManager = (StaggeredGridLayoutManager) mRecyclerViewAllPost.getLayoutManager(); 
    mRecyclerViewAllPost.addOnScrollListener(new RecyclerView.OnScrollListener() { 
     @Override 
     public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
      super.onScrolled(recyclerView, dx, dy); 

      int[] lastVisibleItemPositions = linearLayoutManager.findLastVisibleItemPositions(null); 
      int lastVisibleItem = getLastVisibleItem(lastVisibleItemPositions); 
      int totalItemCount = linearLayoutManager.getItemCount(); 
      if (!isLoading && totalItemCount <= (lastVisibleItem + visibleThreshold)) { 
       print("load more item "); 
       isLoading = true; 
      } 
     } 
    }); 

und getLastVisibleItem Methode wie folgt:

public int getLastVisibleItem(int[] lastVisibleItemPositions) { 
    int maxSize = 0; 
    for (int i = 0; i < lastVisibleItemPositions.length; i++) { 
     if (i == 0) { 
      maxSize = lastVisibleItemPositions[i]; 
     } 
     else if (lastVisibleItemPositions[i] > maxSize) { 
      maxSize = lastVisibleItemPositions[i]; 
     } 
    } 
    return maxSize; 
} 
Verwandte Themen