2012-02-06 18 views
9

मुझे पता है कि 'getView कुछ बार कहा जाता है' के इस मुद्दे के बारे में कुछ प्रश्न हैं लेकिन मेरी समस्या थोड़ा अलग है।ListView - getView को बहुत अधिक बार कहा जाता है

मेरे पास एक कस्टम सूची है कस्टम पंक्ति के साथ देखें (एक row_layout.xml का उपयोग किया गया)। यह आमतौर पर अच्छी तरह से काम करता है। शुरुआत में मुझे देखने के लिए कई कॉलों में समस्या थी और इसे स्टैक ओवरफ्लो में देखे गए तरीकों में से एक का उपयोग करके तय किया गया था। ('usedPositions' सरणी का उपयोग कर)।

अब, मैं इस परिदृश्य में लॉग इन देखता हूं: getView pos 0, getView pos 1, getView pos 0, getView pos 1. इससे मेरी पंक्तियों को दोगुना कर दिया गया। ऐसा तब होता है जब मैं एक नई गतिविधि को कॉल करता हूं जो वर्तमान गतिविधि को कवर करता है और फिर उस गतिविधि को बंद करता है। (उदाहरण के लिए, कैमरा गतिविधि खोलें और फिर इसे बंद करें)।

public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    View row = convertView; 
    Toast toast = Toast.makeText(this.context, "getView " + position, 1000); 
    toast.show(); 
    String pos = Integer.toString(position); 
    if (!usedPositions.contains(pos)) { 

     CardHolder holder = null; 

     if(row == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new CardHolder(); 
      //holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon); 
      holder.txtCouponTitle = (TextView)row.findViewById(R.id.txtTitle); 
      holder.txtBusinessName = (TextView)row.findViewById(R.id.txtBusinessName); 
      row.setTag(holder); 
     } 
     else 
     { 
      holder = (CardHolder)row.getTag(); 
     } 

     Card card = data.get(position); 
     holder.txtCouponTitle.setText(card.couponTitle); 
     holder.txtBusinessName.setText(card.businessName); 
     //holder.imgIcon.setImageResource(card.icon); 

     TableLayout table = (TableLayout)row.findViewById(R.id.imagesTable); 
     for (int r=1; r<=1; r++){ 
      TableRow tr = new TableRow(this.context); 
      for (int c=1; c<=10; c++){ 
       ImageView im = new ImageView (this.context); 
       im.setImageDrawable(this.context.getResources().getDrawable(c<= card.numberOfStamps ? R.drawable.stamp_red :R.drawable.stamp_grey)); 
       im.setPadding(6, 0, 0, 0); //padding in each image if needed 
       //add here on click event etc for each image... 
       //... 
       tr.addView(im, 40,40); 
      } 
      table.addView(tr); 
     } 

     // Your code to fill the imageView object content 
     usedPositions.add(pos); // holds the used position 
    } 
    else 
     usedPositions.remove(pos); 

    return row; 
} 

आप मुझे बता सकते कि क्या गलत है:

मैं अपने कोड दिखाई देगा?

+0

[संभावित सूचीदृश्य एडाप्टर getView विधि को कई बार कहा जा रहा है, और कोई सुसंगत क्रम में नहीं] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/2618272/custom-listview-adapter-getview-method-being-called- एकाधिक-बार-और-इन-नो-सह) – engincancan

उत्तर

10

Quoting एंड्रॉयड इंजीनियर RomainGuy

यह कोई मुद्दा नहीं है, वहाँ में आदेश पर बिल्कुल कोई गारंटी जो getView() कहा जाएगा और न ही कितनी बार है।

तो सबसे अच्छा आप संभाल सकते हैं re-using the existing views (पंक्ति लेआउट) ठीक से है।

Here is another अच्छी पोस्ट।

+0

क्या आप इसका पुन: उपयोग कैसे कर सकते हैं? –

+0

[दूसरा लिंक] देखें (http://android.amberfog.com/?p=296) .. –

+0

मुझे सूचीदृश्य में स्टैक ओवरफ्लो त्रुटि मिलती है और एक विधि के लिए @ ललितपोपानी रिकर्सिव कॉल के अनुसार यह अपवाद उत्पन्न होता है। मैं एंड्रॉइड 2.3 का उपयोग कर रहा हूँ। कृपया अपने विचार साझा करें। – MKJParekh

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