2015-11-04 28 views
7

私はこれをgithubで使ってSearchView + Recyclerviewを実装しました。 GITHUB
私の次のステップは、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は、繰り返しの1つの間に 'mRecyclerView.getChildAt(valueThisIteration) 'からnull値を取得していると指摘しています。あなたは単にRecyclerViewのアイテムクリックを処理しようとしていますか?それはあなたが後になっている場合、それを行うためのより良い方法があります。 – AdamMc331

+0

それは1つです。しかし、私はまた、リサイクラービューで選択したアイテムを取得したい。それを変数などに格納します。 –

+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内のクリックロジックを処理するメリットの説明については、RecyclerViewとListViewを比較して書いたblog postをチェックしてください(「もっと明示的なクリックリスナー」というセクションを見てください)。

+0

ありがとうございます!出来た。 しかし、私の波及効果はなくなりました。 :/ –

+0

私は今それを修正しました。これは本当にありがとう! –

+0

@CharlesGalvez私は嘘をつかないだろう、私は自分自身もそれを働かせることができていない。私がこれを使ったアプリでは波紋が単なる美容的なメリットなので、私はそれをやりましょう。私はそれを調べますが、私がそれを理解することができれば私は戻ってあなたに知らせるでしょう。 – AdamMc331

関連する問題