2016-10-26 22 views
3

Ich habe einige Bilder im horizontalen Raster angeordnet. Ich möchte mein Raster mit wichtigen Ereignissen von links nach rechts und von rechts nach links verschieben. Wenn ich durch das Gitter gehe passiert zwei DingeRecyclerView stürzt beim Scrollen

  1. Der Artikel an zweiter Stelle ist ausgewählt. Zum Beispiel bin ich auf Position 0 und möchte das nächste Element an Position 1 auswählen, aber mein Raster wählt das Element Position 2 und überspringt das Element Position 1.

  2. beim Scrollen erhalte ich die Null-Zeiger Ausnahme

    if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) 
        { 
        if (mCurrentSelectedPosition + 1 < getItemCount()) { 
        Log.e("current position1",Integer.toString(mCurrentSelectedPosition)); 
    
        gridHolder = (GridView_Holder) mRecyclerView.findViewHolderForPosition(mCurrentSelectedPosition); 
        gridHolder.itemView.setSelected(false); 
        notifyItemChanged(mCurrentSelectedPosition); 
        notifyDataSetChanged(); 
    
        int lastItem = lm.findLastCompletelyVisibleItemPosition(); 
        Log.e("last item",Integer.toString(lastItem)); 
    
        if ((mCurrentSelectedPosition + 1) > lastItem) { 
         // Log.e("Is less", "true"); 
         recyclerView.smoothScrollToPosition(mCurrentSelectedPosition + 1); 
         Log.e("current position2",Integer.toString(mCurrentSelectedPosition)); 
    
        } else { 
         gridHolder = (GridView_Holder) mRecyclerView.findViewHolderForPosition(mCurrentSelectedPosition + 1); 
         gridHolder.itemView.setSelected(true); 
         Log.e("current position3",Integer.toString(mCurrentSelectedPosition)); 
        } 
    
        mCurrentSelectedPosition += 1; 
        Log.e("current position4",Integer.toString(mCurrentSelectedPosition)); 
    } 
    return true; 
    } 
    

scroll Zuhörer

gridRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener(){ 
     @Override 
     public void onScrolled(RecyclerView recyclerView, int x, int y) 
     { 
      super.onScrolled(recyclerView, x, y); 
      try { 
       GridView_Holder gridHolder; 
       gridHolder= (GridView_Holder) recyclerView.findViewHolderForPosition(adapter.mCurrentSelectedPosition); 

       gridHolder.itemView.setSelected(true); 
      }catch(Exception e){ 
       Log.e("exception",e.getMessage()); 
      } 

     } 

dies mein logcat ist

java.lang.NullPointerException: Attempt to read from field 'android.view.View android.support.v7.widget.RecyclerView$ViewHolder.itemView' on a null object reference 
at com.winettv.recylcerviewwithdpad.GridView_Recycler_Adapter$1.onKey(GridView_Recycler_Adapter.java:193) 
at android.view.View.dispatchKeyEvent(View.java:9230) 
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1635) 
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640) 
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640) 
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640) 
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640) 
at android.widget.ScrollView.dispatchKeyEvent(ScrollView.java:379) 
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640) 
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640) 
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640) 
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640) 
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1640) 
at com.android.internal.policy.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2395) 
at com.android.internal.policy.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1727) 
at android.app.Activity.dispatchKeyEvent(Activity.java:2725) 
at android.support.v7.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:543) 
at android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:53) 
at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDelegateImplBase.java:315) 
+1

[findViewHolderForPosition] (https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#findViewHolderForPosition (int)) veraltet ist, müssen Sie es mit [findViewHolderForAdapterPosition versucht zu ersetzen ] (https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#findViewHolderForAdapterPosition (int))? – Rehan

Antwort

1

Wenn ich Bibliothek mit benutzerdefinierten Übersetzung während Scroll entwickelte ich hatte das gleiche Problem. Nur beim schnellen Scrollen, als ich versuchte, von der Liste aus auf das View-Element zuzugreifen, war das null und hier ist NPE.

So gibt es ziemlich einfache Lösung einfach Elemente überspringen, die leer ist, und mit neuen fortfahren. In meinem Fall war es so:

// Other init.... 
for (int i = 0; i < MainListView.getChildCount; i++) { 
    if (MainListView.getChildAt(i) == null) 
     continue; 
    // Continue base behavior 
} 

Dies geschieht basierend auf Scroll (die Eltern für RecycleView ist, Listview, etc.) Wenn wir den Zugriff auf anzeigen versuchen, die nun neu erstellt. Wie auch immer, nur einfache Null-Überprüfung sollte Ihr Problem lösen.

UPDATE 1:

auch Caching Ansichtslayouts von RecyclerView basiert, benötigen Sie eine andere Option. Siehe unten.

gridRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener(){ 
     @Override 
     public void onScrolled(RecyclerView recyclerView, int x, int y) 
     { 
      super.onScrolled(recyclerView, x, y); 
      GridView_Holder gridHolder; 
      gridHolder= (GridView_Holder) recyclerView.findViewHolderForPosition(adapter.mCurrentSelectedPosition); 
      if (gridHolder != null && gridHolder.itemView != null) { 
        gridHolder.itemView.setSelected(true); 
      } 
     } 
} 
+0

Ich stürze beim Scrollen ab. Ich habe den Code von onScrollListener hinzugefügt. bitte prüfe. – Andrain

3

Im Code gr idHolder.itemView.setSelected (true); GridHolder war null.

Ändern Sie den Code wie folgt und versuchen Sie es.

if ((mCurrentSelectedPosition + 1) > lastItem) { 
     // Log.e("Is less", "true"); 
     recyclerView.smoothScrollToPosition(mCurrentSelectedPosition); 
     Log.e("current position2",Integer.toString(mCurrentSelectedPosition)); 

    } else { 
     gridHolder = (GridView_Holder) mRecyclerView.findViewHolderForPosition(mCurrentSelectedPosition); 
     gridHolder.itemView.setSelected(true); 
     Log.e("current position3",Integer.toString(mCurrentSelectedPosition)); 
    } 

Grund für den Absturz.

+0

das löst mein Problem nicht Ich stehe immer noch vor dem gleichen Absturz – Andrain