2015-11-04 12 views
7

मैंने जीथ्यूब पर इसका उपयोग करके सर्च व्यू + रीसाइक्लर्विव लागू किया है। GITHUB
मेरा अगला कदम आइटम को रीसाइक्लिंग व्यू पर चयनित भाग पर प्राप्त करना है।
फिर मैंने कुछ कोड को बच्चे को पुनर्नवीनीकरण पर प्राप्त करने के लिए देखा।
कोडChildAt (अनुक्रमणिका) = 0 जब कोड काम कर रहा है।
लेकिन जब मैं इंडेक्स = 12 या उस से अधिक डालता हूं।
कार्यक्रम दुर्घटनाग्रस्त हो गया।रीसाइक्लर्विव (रीसाइक्लिंगव्यू पर आइटम प्राप्त करना)

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

वैसे ही स्टैकट्रेस बताता है कि आपको पुनरावृत्ति में से एक के दौरान 'mRecyclerView.getChildAt (valueThisIteration)' से शून्य मान मिल रहा है। क्या आप बस RecyclerView के आइटम क्लिक को संभालने का प्रयास कर रहे हैं? ऐसा करने के बेहतर तरीके हैं, यदि आप यही कर रहे हैं। – AdamMc331

+0

एक है। लेकिन मैं चयनित आइटम को रीसाइक्लिंग व्यू पर भी प्राप्त करना चाहता हूं। इसे एक चर में स्टोर करें और इसी तरह। –

+0

ठीक है। मैं एक उत्तर लिखूंगा, मुझे विश्वास है कि मैं समझता हूं। – AdamMc331

उत्तर

23

एक RecyclerView में आइटम क्लिक के रख-रखाव के लिए, मैं सुझाव है कि आप अपने एडाप्टर के 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 अंदर होता है अपने उदाहरण के लिए बदल जाएगा, लेकिन मुझे आशा है कि यह सही रास्ते पर आप तय करता है। इसके एक और नमूने के लिए, साथ ही व्यूहोल्डर के अंदर क्लिक तर्क को संभालने के लाभों के लिए एक स्पष्टीकरण के लिए, blog post देखें, जिसे मैंने रीसाइक्लिंग व्यू और लिस्टव्यू की तुलना में लिखा है ("अधिक स्पष्ट क्लिक श्रोताओं" लेबल वाले अनुभाग को देखें।

+0

इसके लिए धन्यवाद! इसने काम कर दिया। लेकिन मेरा लहर प्रभाव चला गया। :/ –

+0

मैंने इसे अभी तय किया है। इस लिए आपका बहुत - बहुत धन्यवाद! –

+0

@ चार्ल्स गल्वेज़ मैं झूठ नहीं बोलूंगा, मैं खुद को बाहर करने में सक्षम नहीं हूं। उन ऐप्स में जिन्हें मैंने इसका उपयोग किया है, मैं बस इसे जाने देता हूं क्योंकि लहर केवल कॉस्मेटिक लाभ है। मैं इसे देख लूंगा हालांकि और अगर मैं इसे समझ सकता हूं तो मैं वापस आऊंगा और आपको बता दूंगा। – AdamMc331

संबंधित मुद्दे