2011-04-12 12 views
5

मेरे पास 2 अलग-अलग प्रकार के लेआउट के साथ ListView है: एक छवि के साथ और छवि के बिना कोई अन्य। मैं this जैसे कुछ करने की कोशिश करता हूं। मैं BaseAdapter की getView ओवरराइड:अलग-अलग आइटम लेआउट के साथ ListViews के लिए ViewHolders

public View getView(int position, View convertView, ViewGroup parent) { 
     Map<String, String> item = mData.get(position); 
     if(item.get("image_location").equals("") == true){ 
      ViewHolderWithoutImage holder = new ViewHolderWithoutImage(); 
      if(convertView == null){ 
       convertView = mInflater.inflate(R.layout.row_without_image, null); 
       holder.title = (TextView)convertView.findViewById(R.id.title); 
       holder.firstParagraph = (TextView)convertView.findViewById(R.id.first_paragraph); 
       convertView.setTag(holder); 
      }else{ 
       holder = (ViewHolderWithoutImage)convertView.getTag(); 
      } 
      holder.title.setText(mData.get(position).get("title").toString()); 
      holder.firstParagraph.setText(item.get("first_paragraph").toString()); 

     }else{ 
      ViewHolderWithImage holder = new ViewHolderWithImage(); 
      Bitmap bm = null; 
      if(convertView == null){ 
       convertView = mInflater.inflate(R.layout.row_with_image, null); 
       holder.title = (TextView)convertView.findViewById(R.id.title_image); 
       holder.firstParagraph = (TextView)convertView.findViewById(R.id.first_paragraph_image); 
       holder.image = (ImageView)convertView.findViewById(R.id.image); 
       convertView.setTag(holder); 
      }else{ 
       holder = (ViewHolderWithImage)convertView.getTag(); 
      } 

      holder.title.setText(mData.get(position).get("title").toString()); 
      holder.firstParagraph.setText(item.get("first_paragraph").toString()); 
      String location = imageBaseUrl + item.get("image_location"); 
      bm = downloadImage(location); 
      holder.image.setImageBitmap(bm); 
     } 
     return convertView; 
    } 

मेरे ViewHolders कक्षाएं:

static class ViewHolderWithImage { 
     TextView title; 
     TextView firstParagraph; 
     ImageView image; 
    } 

    static class ViewHolderWithoutImage { 
     TextView title; 
     TextView firstParagraph; 
    } 

यह दूसरे भाग के बिना काम करता है, लेकिन दुर्घटनाओं जब यह जब item.get("image_location").equals("") != truejava.lang.reflect.InvocationTargetException साथ भाग में

holder = (ViewHolderWithImage)convertView.getTag(); 

के लिए जा रहा । कोई विचार मैं इसे कैसे ठीक कर सकता हूं?

+1

getCause() या getTargetException() का उपयोग करने का प्रयास करें (यहां देखें: http://download.oracle.com/javase/1.4.2/docs/api/java/lang/reflect/InvocationTargetException.html) अधिक जानकारी प्राप्त करने के लिए अपवाद के बारे में। – MByD

उत्तर

19

मुझे लगता है कि ऐसा होता है क्योंकि कनवर्टव्यू के टैग में विभिन्न प्रकार के साथ व्यूहोल्डर होता है। convertView टाइप करने का प्रयास करें:

if(item.get("image_location").equals("") == true){ 
    ... 
    if(convertView == null || !(convertView.getTag() instanceof ViewHolderWithoutImage)){ 
    ... 
}else{ 
    ... 
    if(convertView == null || !(convertView.getTag() instanceof ViewHolderWithImage)){ 
     convertView = mInflater.inflate(R.layout.row_with_image, null); 
     ... 

पीएस अलग-अलग लेआउट को संभालने के लिए सिस्टम विधियों का उपयोग करना बेहतर है (getItemViewType() ओवरराइड करें)। There is good article on this topic

+0

वास्तव में एक महान विचार है। मेरी समस्या हल हो गई है। – Salim

+0

लेख के कोड का अंतिम भाग सही नहीं है। वह इस मामले का प्रबंधन नहीं कर रहा है उदाहरण के लिए: कन्वर्ट व्यू! = नल और वर्तमान में R.layout.item1 को instanciated लेकिन वर्तमान पॉजिटॉन को R.layout.item2 की आवश्यकता है –

1

आप अपने एडाप्टर पर getItemViewType() और getViewTypeCount() ओवरराइड करना चाहिए, ViewHolderWithoutImage और 1 ViewHolderWithImage के लिए के लिए, प्रत्येक पंक्ति प्रकार के लिए एक विशिष्ट संख्या लौटने 0 की तरह। इस तरह, getView() तुरंत हल हो सकता है जो तुरंत चालू करने के लिए देखें।

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