2016-02-23 20 views
5

मुझे क्रैकलीटिक्स के बावजूद यह स्टैक ट्रेस मिला है। मुझे नहीं पता कि मुद्दा कहां है।पुनर्चक्रण घातक अपवाद देखें: java.lang.ArrayIndexOutOfBoundsException

क्या StaggeredGridLayoutManager का कोई विकल्प है जिसका उपयोग मैं लेआउट जैसे सूचीदृश्य प्राप्त करने के लिए कर सकता हूं।

Fatal Exception: java.lang.ArrayIndexOutOfBoundsException: start < 0 || end > len. start=-1, end=11, len=11 
    at java.util.Arrays.checkStartAndEnd(Arrays.java:1745) 
    at java.util.Arrays.fill(Arrays.java:803) 
    at android.support.v7.widget.StaggeredGridLayoutManager$LazySpanLookup.invalidateAfter(SourceFile:2404) 
    at android.support.v7.widget.StaggeredGridLayoutManager.handleUpdate(SourceFile:1373) 
    at android.support.v7.widget.StaggeredGridLayoutManager.onItemsRemoved(SourceFile:1327) 
    at android.support.v7.widget.RecyclerView$6.dispatchUpdate(SourceFile:725) 
    at android.support.v7.widget.RecyclerView$6.onDispatchFirstPass(SourceFile:716) 
    at android.support.v7.widget.AdapterHelper.dispatchFirstPassAndUpdateViewHolders(SourceFile:316) 
    at android.support.v7.widget.AdapterHelper.dispatchAndUpdateViewHolders(SourceFile:302) 
    at android.support.v7.widget.AdapterHelper.applyRemove(SourceFile:182) 
    at android.support.v7.widget.AdapterHelper.preProcess(SourceFile:103) 
    at android.support.v7.widget.RecyclerView.processAdapterUpdatesAndSetAnimationFlags(SourceFile:2767) 
    at android.support.v7.widget.RecyclerView.onMeasure(SourceFile:2538) 
    at android.view.View.measure(View.java:16521) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5134) 
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
    at android.view.View.measure(View.java:16521) 
    at android.support.v4.view.ViewPager.onMeasure(SourceFile:1489) 
    at android.view.View.measure(View.java:16521) 
    at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719) 
    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455) 
    at android.view.View.measure(View.java:16521) 
    at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719) 
    at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455) 
    at android.view.View.measure(View.java:16521) 
    at android.support.v4.widget.DrawerLayout.onMeasure(SourceFile:940) 
    at android.view.View.measure(View.java:16521) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5134) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
    at android.support.v7.widget.ContentFrameLayout.onMeasure(SourceFile:135) 
    at android.view.View.measure(View.java:16521) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5134) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
    at android.view.View.measure(View.java:16521) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5134) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
    at android.view.View.measure(View.java:16521) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5134) 
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404) 
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
    at android.view.View.measure(View.java:16521) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5134) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2331) 
    at android.view.View.measure(View.java:16521) 
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1925) 
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1117) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1299) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1004) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5739) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:574) 
    at android.view.Choreographer.doFrame(Choreographer.java:544) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747) 
    at android.os.Handler.handleCallback(Handler.java:733) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5380) 
    at java.lang.reflect.Method.invokeNative(Method.java) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:970) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:786) 
    at dalvik.system.NativeStart.main(NativeStart.java) 

यह है कि मैं क्या एडाप्टर

 @Override 
public void onBindViewHolder(final ViewHolder holder, final int position) { 
    holder.relative.setClickable(true); 

    holder.relative.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if (itemClickListener != null) 
       itemClickListener.onClick(v, position); 
      else 
       AppConfig.log("itemClickLestener was null"); 
     } 
    }); 

    holder.relative.setOnLongClickListener(new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(View v) { 
      if (itemClickListener != null) 
       itemClickListener.onLongClick(v, position); 
      return true; 
     } 
    }); 
    return view; 
    } 

उत्तर

15

ऐसा लगता है कि getAdapterPosition() जबकि रेमंड देखें लेआउट गणना कर रहे हैं (संभवतः एक notifyDataSetChanged() कॉल से शुरू हो रहा) कॉल करने के लिए कोशिश कर रहे थे।

हमेशा इस

final int position = getAdapterPosition(); 
if(positon != RecyclerView.NO_POSITION){ 
    // you can trust the adapter position 
    // do whatever you intend to do with this position 
} 

की तरह इसे संभाल प्रलेखन स्पष्ट रूप से निम्नलिखित

आप एक ViewHolder क्लिक पर अनुकूलक में आइटम पर पहुंच बनाना चाहते हैं तो कहा गया है, तो आप getAdapterPosition का उपयोग करना चाहिए()। सावधान रहें कि अगर विधियांडेटाट चेंज() को सूचित किया गया है और नए लेआउट की गणना नहीं की गई है तो ये विधियां एडाप्टर स्थितियों की गणना करने में सक्षम नहीं हो सकती हैं। इन कारणों से, आपको सावधानीपूर्वक इन विधियों से NO_POSITION या शून्य परिणामों को संभालना चाहिए।

अद्यतन

अब जब कि तुम अंत में कुछ कोड पोस्ट किया है। यहां कुछ चीजें हैं जिन पर आपको विचार करना चाहिए।

  1. बाइंडव्यूहोल्डर के अंदर अंतिम पैरामीटर पास न करें। जब तक ऑनक्लिक लिस्टनर को निकाल दिया जाता है तब तक स्थिति की गारंटी नहीं होती है जैसा कि आपको लगता है कि यह होगा। तो onBindViewHolder विधि के अंदर किसी भी श्रोताओं निर्दिष्ट न करें इस

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
        holder.relative.setClickable(true); 
        //do other stuff 
    } 
    
  2. है। चूंकि दृश्य रीसाइक्लिंग हो जाता है, आप श्रोताओं को एक ही दृश्य में कई बार सेट अप करते हैं। इसके बजाय, ऊपर फिक्सिंग आपकी समस्या का समाधान हो सकता है दृश्य धारक वर्ग या onCreateViewHolder विधि के अंदर यह सेट नीचे

    @Override 
    public MyViewHolder onCreateViewHolder (ViewGroup parent, int viewType) { 
        View myView = LayoutInflater.from(parent.getContext()) 
             .inflate(R.layout.my_layout, parent, false); 
    
        //setting listeners on creation 
        myView.setOnClickListener(new View.OnClickListener(){ 
         @Override 
         public void onClick(View v) { 
          final int position = getAdapterPosition(); 
          if(position != RecyclerView.NO_POSITION){ 
           //do whatever you want with the clicked position 
          } 
         } 
        }); 
    
        //return the view holder 
        return new MyViewHolder(myView); 
    } 
    

    की तरह या ViewHolder कक्षा में

    public class MyViewHolder extends RecyclerView.ViewHolder { 
    
        public MyViewHolder(View itemView) { 
         super(itemView); 
    
         //setting listeners inside viewHolder class 
         itemView.setOnClickListener(new View.OnClickListener(){ 
          @Override 
          public void onClick(View v) { 
           final int position = getAdapterPosition(); 
           if(position != RecyclerView.NO_POSITION){ 
            //do whatever you want with the clicked position 
           } 
          } 
          }); 
         } 
        } 
    

। मैं आपको रीसाइक्लिंग व्यू के बारे में Google Dev Summit 2015 वीडियो की जांच करने की अत्यधिक अनुशंसा करता हूं। यह वास्तव में दिलचस्प है और वे रीसाइक्लर व्यू के इन्स और आउट के बारे में बात करते हैं। वे यह भी उल्लेख करते हैं कि क्यों अंतिम पैरामीटर को BinViewHolder में पास नहीं किया जाए। उस वीडियो में सटीक पल देखने के लिए here पर क्लिक करें जिसमें वे इसके बारे में बात करते हैं।

+0

जांचने के लिए मेरे पास अब नया ग्रिडलाउटमैनेजर (this.getActivity(), 1) का उपयोग करके मेरा कोड है, आपको इसके बारे में क्या लगता है, मुझे getAdapterPosition ( –

+0

का उपयोग करके कोई कोड नहीं मिला है, मुझे नहीं लगता आपके द्वारा उपयोग किए जाने वाले लेआउट मैनेजर के साथ कुछ भी करना है। क्या आप अपना एडाप्टर क्लास पोस्ट कर सकते हैं? –

+0

मैं तीन एडाप्टर में StaggeredGridLayoutManager का उपयोग कर रहा था। मुझे नहीं पता कि वास्तव में यह समस्याएं कहां से उत्पन्न हो रही हैं। इसलिए कोई भी विवरण साझा करने में सक्षम नहीं –

0

ज्यादातर यह गलती से आपकी bindview पर जहाँ आप अपने ArrayList के डेटा का उपयोग किया जाएगा उत्पन्न हो जाएगा में से एक में श्रोताओं क्लिक संभालने के लिए कर रहा हूँ है। सुनिश्चित करें कि आपने स्थिति -1 सरणीसूची का मान उपयोग किया है।

+0

मेरे पास अब नया ग्रिडलाउट मैनेजर (यह।getActivity(), 1) आप इस –

+0

@ राजनिष मिश्रा के बारे में क्या सोचते हैं यह ठीक है लेकिन क्या आप हमें बस बाइंडव्यूल्डर दिखा सकते हैं? –

+0

मैंने अपना Ques –

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