2010-07-08 9 views
8

मैं एक कस्टम सूची एडाप्टर के साथ एक ListView है। GetView() विधि में, ViewVold14'java के लिए API डेमो में दिखाए गए व्यूहोल्डर 'पैटर्न' का उपयोग कर रहा हूं। जब मैं पहली बार सूची प्रस्तुत करता हूं तो यह सही ढंग से लोड हो रहा है। हालांकि, इस मुद्दे को मैं में चल रहा हूँ यह है कि जब मैं सूची स्क्रॉल करें, मैं सूची के लिए डेटा गलत पंक्तियों में दिखाई दिखाई दे रही है (यानी एक TextView उस पंक्ति 10 में होना चाहिए ऊपर पंक्ति 2 में उदाहरण के लिए दिख रहा है)। हालांकि, जब मैं व्यूहोल्डर का उपयोग नहीं करता, और इसके बजाय हर बार findViewById() को कॉल करता हूं, तो सूची दृश्य सही ढंग से प्रस्तुत करता है।एंड्रॉइड लिस्टव्यू व्यूहोल्डर। जब यह उपयोग करने के लिए, और जब नहीं

उत्तर

10

हालांकि, इस मुद्दे को मैं में चल रहा हूँ यह है कि जब मैं सूची स्क्रॉल करें, मैं गलत पंक्तियों में दिखाई देते हैं (सूची के लिए डेटा दिखाई दे रहा हूँ अर्थात् एक TextView कि में होना चाहिए पंक्ति 10 उदाहरण के लिए पंक्ति 2 में दिखा रहा है)।

सबसे अधिक संभावना है, तो आप को अनुचित तरीके से अपनी पंक्तियों रीसाइक्लिंग रहे हैं, जैसे कि ViewHolders आप जोड़ तोड़ कर रहे हैं पंक्ति आप लौट रहे हैं के लिए सही नहीं हैं।

Here is a free excerpt अपनी पुस्तकों में से एक है कि पंक्ति रीसाइक्लिंग के बारे में अधिक में चला जाता है से - शायद यह आप की पहचान करने में मदद मिलेगी, जहां कोई बात बिगड़ जा रहे हैं।

+2

यह वास्तव में एक महान ट्यूटोरियल है, धन्यवाद। – eric2323223

1

तो मैं मैं यहाँ असली मुद्दा की खोज की है। जब आप प्रत्येक पंक्ति के लिए फ्लाई पर लेआउट पैरामीटर सेट करते हैं, तो आपको यह सुनिश्चित करना होगा कि आप इसे सभी स्थितियों के लिए करें। मेरी समस्या यह है कि अगर यह पहली पंक्ति थी, मैं एक लेआउट परम (गद्दी या मार्जिन आदि की तरह) की स्थापना की है, लेकिन फिर अगर यह एक मध्य पंक्ति था, मैं स्पष्ट रूप से उन पैरामीटर यह सोच कर कि यह सिर्फ प्रयोग करेंगे क्या फुलाया गया था सेट नहीं किया था दृश्य inflater द्वारा। यह बताता है कि जब मैंने हर बार दृश्य को फुलाया तो यह क्यों काम करता था।

से पहले:

if (position == 0) { 

      layoutParams.topMargin = uiHelper.getDip(15.0f); 
      layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, 
        RelativeLayout.TRUE); 
      holder.actionMenu.setLayoutParams(layoutParams); 

      holder.contentLayout.setBackgroundResource(R.drawable.top_row); 

     } else if (position == posts.size() - 1) { 
      holder.contentLayout 
        .setBackgroundResource(R.drawable.bottom_row); 

      holder.contentLayout.setPadding(holder.contentLayout 
        .getPaddingLeft(), 
        holder.contentLayout.getPaddingTop(), 
        holder.contentLayout.getPaddingRight(), 
        holder.contentLayout.getPaddingBottom() + uiHelper.getDip(10.0f)); 

     } else { 
      holder.contentLayout 
        .setBackgroundResource(R.drawable.inner_row); 
     } 

के बाद: `

  layoutParams.topMargin = uiHelper.getDip(10.0f); 
     holder.contentLayout.setPadding(holder.contentLayout 
       .getPaddingLeft(), 
       holder.contentLayout.getPaddingTop(), 
       holder.contentLayout.getPaddingRight(), 
       uiHelper.getDip(10.0f)); 
     if (position == 0) { 

      layoutParams.topMargin = uiHelper.getDip(15.0f); 
      layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, 
        RelativeLayout.TRUE); 

      holder.contentLayout.setBackgroundResource(R.drawable.top_row); 

     } else if (position == posts.size() - 1) { 
      holder.contentLayout 
        .setBackgroundResource(R.drawable.bottom_row); 

      holder.contentLayout.setPadding(holder.contentLayout 
        .getPaddingLeft(), 
        holder.contentLayout.getPaddingTop(), 
        holder.contentLayout.getPaddingRight(), 
        uiHelper.getDip(20.0f)); 

     } else { 

      holder.contentLayout 
        .setBackgroundResource(R.drawable.inner_row); 

     } 

     holder.actionMenu.setLayoutParams(layoutParams); 
2
  • मैं का सामना करना पड़ा एक ही समस्या
  • techninc
  • कारण नीचे का उपयोग कर हल: यहाँ एक से पहले & के बाद है एडाप्टर नहीं अक्सर लोड किया गया।
  • आपके कस्टम एडाप्टर कक्षा में

    जोड़ने ViewHolder पहुँच विनिर्देशक का उपयोग कर

    private static class ViewHolder { 
    
         protected TextView itemName; 
    
        } 
    

में जाओ दृश्य विधि

@Override 

     public View getView(int position, View view, ViewGroup viewGroup) { 

      // create a ViewHolder reference 
      ViewHolder holder; 

      //check to see if the reused view is null or not, if is not null then reuse it 
      if (view == null) { 
       holder = new ViewHolder(); 

       view = mLayoutInflater.inflate(R.layout.list_item, null); 
       holder.itemName = (TextView) view.findViewById(R.id.list_item_text_view); 

       // the setTag is used to store the data within this view 
       view.setTag(holder); 
      } else { 
       // the getTag returns the viewHolder object set as a tag to the view 
       holder = (ViewHolder)view.getTag(); 
      } 
    // now Use Holder object toget Idss 

    holder.itemName.setText(" sample text based on position "); 
    } 

महत्वपूर्ण: और हम दृश्य के लिए कोई भी टैग सेट नहीं करना चाहिए Viewholder छोड़कर वस्तु वस्तु

+0

इस उपयोगी कोड स्निप के लिए बहुत बहुत धन्यवाद। – swiftBoy

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