2011-04-12 8 views
5

두 가지 레이아웃 유형 (하나는 이미지가 있고 다른 하나는 이미지가 없음)이있는 ListView가 있습니다. 나는 this과 같은 것을하려고 노력한다. 나는 BaseAdapter의의 getView를 오버라이드 (override) :다른 항목 레이아웃이있는 ListView에 대한 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의 태그가 다른 유형의 ViewHolder를 보유하고 있기 때문에 발생한다고 생각합니다. 유형을 확인하십시오 :

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); 
     ... 

P. 다른 레이아웃을 처리 할 때 시스템 메소드를 사용하는 것이 더 좋습니다 (getItemViewType() 무시). There is good article on this topic.

+0

정말 대단하다고 생각합니다. 내 문제가 해결되었습니다. – Salim

+0

기사의 마지막 코드 부분이 올바르지 않습니다. 그는 예를 들어이 사례를 관리하지 않습니다 : convertView! = null이며 현재 R.layout.item1에 인스턴스화되었지만 현재 위치는 R.layout.item2가 필요합니다. –

1

당신은 ViewHolderWithImage에 대한 ViewHolderWithoutImage 1 0처럼, 각 행의 유형에 대한 별개의 수를 반환, 어댑터에 getItemViewType()getViewTypeCount()를 오버라이드 (override) 할 필요가 있습니다. 이 방법을 사용하면 getView()이 인스턴스화 할보기를 올바르게 확인할 수 있습니다.

관련 문제