2016-10-26 8 views
3

У меня есть изображения, расположенные в горизонтальной сетке. Я хочу переместить сетку слева направо и направо налево, используя ключевые события. Когда я двигаюсь через сетку, произошли две вещи:Аварии RecyclerView при прокрутке

  1. Позиция в позиции вторая. Например, я нахожусь в позиции 0 и хочу выбрать следующий элемент в позиции 1, но моя сетка выбирает позицию позиции 2 и пропускает позицию позиции 1.

  2. на прокрутку я получаю исключение нулевого указателя

    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; 
    } 
    

прокрутки слушатель

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()); 
      } 

     } 

это мой LogCat

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 (интермедиат)) осуждается, вы пробовали заменить его [findViewHolderForAdapterPosition ] (https://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#findViewHolderForAdapterPosition (интермедиат))? – Rehan

ответ

1

Когда я разработал библиотеку пользовательского перевода во время прокрутки у меня была такая же проблема. Только при быстрой прокрутке, когда я попытался получить доступ к элементу View из списка, это было null, и вот NPE.

Итак, есть довольно простое решение, просто пропустите элементы, которые пусты, и продолжайте новый. В моем случае это было так:

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

Это происходит, основываясь на ScrollView (который является родителем для RecycleView, ListView и т.д.) Когда мы пытаемся получить доступ View, который перерисовка в настоящее время. Во всяком случае просто простая проверка Null должна решить вашу проблему.

UPDATE 1:

Также на основе кэширования Просмотр макетов RecyclerView, вам нужен другой вариант. Смотри ниже.

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

Я получаю сбой при прокрутке. Я добавил код onScrollListener. пожалуйста, проверьте. – Andrain

3

В коде гр idHolder.itemView.setSelected (истина); gridHolder был null.

Измените код следующим образом и попробуйте.

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)); 
    } 

Причина аварии.

+0

это не решает мою проблему. Я все еще сталкиваюсь с таким же сбоем. – Andrain

 Смежные вопросы

  • Нет связанных вопросов^_^