2015-11-04 3 views
7

Я реализовал SearchView + Recyclerview, используя это на github. GITHUB
Мой следующий шаг - получить элемент на выбранной части в режиме recyclerview.
Затем я увидел, что какой-то код получил ребенка на recyclerview.
Код работает, когда getChildAt (index) = 0.
Но когда я ставлю на индекс = 12 или больше этого.
Программа разбилась.Recyclerview (Получение элемента в Recyclerview)

mRecyclerView.setAdapter(mAdapter); 
     mRecyclerView.addOnItemTouchListener(
       new RecyclerItemClickListener(getContext(), new RecyclerItemClickListener.OnItemClickListener() { 
        @Override 
        public void onItemClick(View view, int position) { 
         final int valueThisIteration = position; 
         mRecyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
          @Override 
          public void onGlobalLayout() { 
           TextView textViewDrawerTitle = (TextView) mRecyclerView.getChildAt(valueThisIteration).findViewById(R.id.tvText); 
           textViewDrawerTitle.setText("Checked"); 
           mRecyclerView.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
          } 
         }); 

        } 
       }) 
     ); 

И я получаю эту ошибку.

11-04 09:36:02.818 1629-1629/? E/AndroidRuntime: FATAL EXCEPTION: main 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime: Process: com.thesis.juandirection.juandirectionfinale, PID: 1629 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at com.thesis.juandirection.juandirectionfinale.fragments.FragmentSearch$1$1.onGlobalLayout(FragmentSearch.java:94) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.view.ViewTreeObserver.dispatchOnGlobalLayout(ViewTreeObserver.java:815) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1867) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.view.Choreographer.doCallbacks(Choreographer.java:580) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.view.Choreographer.doFrame(Choreographer.java:550) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.os.Handler.handleCallback(Handler.java:739) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:95) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:135) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:5221) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Native Method) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Method.java:372) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
11-04 09:36:02.818 1629-1629/? E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
+0

Ну, как указывает StackTrace, вы получаете нулевое значение из 'mRecyclerView.getChildAt (valueThisIteration)' во время одной из итераций. Вы просто пытаетесь обрабатывать клики с элементами RecyclerView? Есть лучшие способы сделать это, если это то, что вам нужно. – AdamMc331

+0

Thats one. Но я также хочу, чтобы выбранный элемент отображался в ресайклере. Храните его в переменной и так далее. –

+0

Хорошо. Я напишу ответ, я считаю, что понимаю. – AdamMc331

ответ

23

Для обработки щелчков элементов в RecyclerView я рекомендую вам переместить вашу логику в ViewHolder вашего адаптера. Вы можете заставить свой ViewHolder реализовать View.OnClickListener и переопределить метод OnClick() для преформы действия. Если ваше действие зависит от выбранного элемента, вы можете ссылаться на него, используя getAdapterPosition(). Код будет выглядеть примерно так:

public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnItemClickListener { 
    public MyViewHolder(View view) { 
     super(view); 

     view.setOnClickListener(this); 
    } 

    @Override 
    public void OnClick(View view) { 
     // Get the item clicked 
     // For this example, I'm assuming your data source is of type `List<MyObject>` 
     MyObject myObject = mDataSource.get(getAdapterPosition()); 
     // Then you can do any actions on it, for example - 
     myObject.setChecked(); 
    } 
} 

Очевидно, что логика, что происходит внутри OnClick изменится на ваш пример, но я надеюсь, что это ставит вас на правильном пути. Для другого примера этого, а также немного объяснения преимуществ обработки логики щелчка внутри ViewHolder, просмотрите blog post, который я написал, сравнивая RecyclerView и ListView (ищите раздел с надписью «Больше явных кликов»).

+0

Спасибо за это! Это сработало. Но мой эффект пульсации исчез. :/ –

+0

Я исправил его сейчас. Большое спасибо за это! –

+0

@CharlesGalvez Я не буду лгать, я тоже не смог справиться с этим. В приложениях, которые я использовал, я просто отпустил это, поскольку пульсация - это просто косметическая выгода. Я посмотрю на него, и если я смогу это выяснить, я вернусь и дам вам знать. – AdamMc331

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