ArrayIndexOutOfBoundsException सूची दृश्य में कई विचारों के लिए कस्टम Android एडाप्टर के साथ


185

मैं अपने ListView के लिए एक कस्टम एडेप्टर बनाने का प्रयास कर रहा हूं क्योंकि सूची में प्रत्येक आइटम का एक अलग दृश्य (लिंक, टॉगल या रेडियो समूह) हो सकता है, लेकिन जब मैं लिस्ट व्यू का उपयोग करने वाली गतिविधि को चलाने के लिए प्रयास करता हूं तो मुझे एक त्रुटि मिलती है। ऐप बंद हो जाता है। एप्लिकेशन को Android 1.6 प्लेटफ़ॉर्म के लिए लक्षित किया गया है।

कोड:

public class MenuListAdapter extends BaseAdapter {
 private static final String LOG_KEY = MenuListAdapter.class.getSimpleName();

 protected List<MenuItem> list;
 protected Context ctx;
 protected LayoutInflater inflater;

 public MenuListAdapter(Context context, List<MenuItem> objects) {
  this.list = objects;
  this.ctx = context;
  this.inflater = (LayoutInflater)this.ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 }

 @Override
 public View getView(int position, View convertView, ViewGroup parent) {
  Log.i(LOG_KEY, "Position: " + position + "; convertView = " + convertView + "; parent=" + parent);
  MenuItem item = list.get(position);
  Log.i(LOG_KEY, "Item=" + item );

        if (convertView == null)  {
            convertView = this.inflater.inflate(item.getLayout(), null);
        }

        return convertView;
 }

 @Override
 public boolean areAllItemsEnabled() {
  return false;
 }

 @Override
 public boolean isEnabled(int position) {
  return true;
 }

 @Override
 public int getCount() {
  return this.list.size();
 }

 @Override
 public MenuItem getItem(int position) {
  return this.list.get(position);
 }

 @Override
 public long getItemId(int position) {
  return position;
 }

 @Override
 public int getItemViewType(int position) {
  Log.i(LOG_KEY, "getItemViewType: " + this.list.get(position).getLayout());
  return this.list.get(position).getLayout();
 }

 @Override
 public int getViewTypeCount() {
  Log.i(LOG_KEY, "getViewTypeCount: " + this.list.size());
  return this.list.size();
 }

}

मुझे प्राप्त होने वाली त्रुटि:

    java.lang.ArrayIndexOutOfBoundsException
  at android.widget.AbsListView$RecycleBin.addScrapView(AbsListView.java:3523)
  at android.widget.ListView.measureHeightOfChildren(ListView.java:1158)
  at android.widget.ListView.onMeasure(ListView.java:1060)
  at android.view.View.measure(View.java:7703)

मुझे पता है कि आवेदन वापस आ रहा है getViewऔर सब कुछ क्रम में लगता है।

क्या इस कारण हो सकता है पर किसी भी विचार की सराहना की जाएगी।

धन्यवाद,

-Dan


हाय दान, आप सुनिश्चित हैं कि getCount तत्व की कुल है आपके ListView पर प्रदर्शित किया जाता है ??? सार्वजनिक int getCount () {इसे वापस करें ।सूचीबद्ध करें (); }
जोर्जेस

4
वे एक कम वर्णनात्मक त्रुटि संदेश के साथ नहीं आ सके ...
जोये

जवाबों:


515

जिस आइटम दृश्य प्रकार से आप वापस लौट रहे हैं

getItemViewType()है >= getViewTypeCount()


24
यह एक बुरा है। इसे डिबग करने का कोई तरीका नहीं। बहुत बहुत धन्यवाद, यह समझाने के लिए रोमेन गाइ।
यार

113
एक और बात है, ViewType 0.22 से शुरू होना चाहिए
HelmiB

16
आपने उत्तर के लिए अब तक 38 अपवोट प्राप्त किया है, इसलिए यह एक सही उत्तर हो सकता है, लेकिन कृपया समस्या के समाधान के लिए कुछ और पाठ जोड़ें और इसे कैसे हल करें..क्योंकि मैं अभी भी इस से बहुत कुछ नहीं समझ सकता।
चिराग पटेल

15
उन लोगों के लिए जो स्टम्प्ड हैं, व्यूटेप को शून्य आधारित इंडेक्स वापस करना चाहिए। जैसे (0, 1, 2 ...)। मेरे मामले में मैंने ViewType के लिए R.layout ... का पुन: उपयोग करने का प्रयास किया। मुझे लगता है कि आंतरिक रूप से ViewType के मूल्य का उपयोग रीसाइक्लिंग पूल के लिए सूचकांक के रूप में किया जा रहा है, न कि एक कुंजी के रूप में।
सैमुअल

2
एंड्रॉइड डेवलपर्स के विपरीत इस त्रुटि को समझाने के लिए धन्यवाद, जो हमेशा की तरह, अपने दस्तावेज़ में इस महत्वपूर्ण शीर्षक का उल्लेख करने के लिए परेशान नहीं किया जा सकता है।
WKS

17

स्वीकृत उत्तर सही है। समस्या से बचने के लिए मैं यह कर रहा हूं:

public enum FoodRowType {
    ONLY_ELEM,
    FIRST_ELEM,
    MID_ELEM,
    LAST_ELEM
}

@Override
public int getViewTypeCount() {
    return FoodRowType.values().length;
}

@Override
public int getItemViewType(int position) {
    return rows.get(position).getViewType();  //returns one of the above types
}

केवल तभी अच्छा हो सकता है जब getItemViewTypeint
dVaffection

0

समस्या तब आती है जब getItemType मान गलत है। यह मान पूर्णांक होना चाहिए और 0 से getViewTypeCount () - 1 तक होना चाहिए।


-3

कारण, सबसे अधिक संभावना है क्योंकि getItemViewType विधि गलत मान लौटा रही है! सूची में प्रत्येक पंक्ति एक दृश्य है। जबकि scrooling getItemViewType व्यू की संख्या से अधिक तक पहुंच जाता है।

क्या करें? मुद्दे से कैसे बचें?

अपनी सूची में पहले दृश्य (पंक्ति) निर्धारित करें जो पहले दिखाया गया है। स्क्रॉल स्क्रॉलिंग मोड्यूलर समीकरण का उपयोग करता है

    @Override
    public int getItemViewType(int position) {
        return choseType(position);//function to use modular equation
    }
    @Override
    public int getViewTypeCount() {
        return 10;
    }

इस उदाहरण में दस दृश्य (10 पंक्ति) है।

private  int choseType(int position){
    if(position%10==0)
        return 0;
    else if(position%10==1)
        return 1;
    else if(position%10==2)
        return 2;
    else if(position%10==3)
        return 3;
    else if(position%10==4)
        return 4;
    else if(position%10==5)
        return 5;
    else if(position%10==6)
        return 6;
    else if(position%10==7)
        return 7;
    else if(position%10==8)
        return 8;
    else
        return 9;


}

जरूरी

कुछ उपयोगकर्ता स्टैकओवरफ़्लो पर एक अन्य प्रश्न का उल्लेख करते हैं

सार्वजनिक int getViewTypeCount () और सार्वजनिक int getItemViewType (int स्थिति) Tooglebutton की तरह ठीक करता है, जो स्‍क्रोलिंग पर राज्‍य की जाँच को स्‍वचालित रूप से सक्षम करता है .. जो कि बड़ा गलत है

toogleButton.setChecked(false);

getView ओवरराइड विधि पर।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.