2011-11-10 3 views
0

ViewHolder 클래스를 활용하도록 사용자 지정 ListView 및 어댑터를 다시 구성한 후 처음에는 코드가 작동하는 것처럼 보였습니다. 그러나 맨 아래로 스크롤하여 목록에 항목을 추가하면 목록 요소가 갑자기 클릭 할 수 없게됩니다. ViewHolder를 사용하기 전에는 그렇지 않았습니다. 목록 요소 내의 사용자 지정 개체는 올바르게 작동합니다. 어댑터에 항목을 추가하면 onItemClickListener 이벤트가 중단됩니다.

어댑터의 getView

:

public View getView(int position, View convertView, ViewGroup parent) { 

    ViewHolder holder; 

    if(convertView == null) 
    { 
     convertView = View.inflate(this.context, R.layout.company_listing, null); 
     Log.d(Cloud.DEBUG_TAG, "Inflating View...");  
     holder = new ViewHolder(convertView, context); 

     convertView.setTag(holder); 

    } 
    else 
    { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.populateFrom(companies.get(position),logoDown); 

    return convertView; 
} 

ViewHolder : 어디에 문제가

class ViewHolder{ 

ImageView theLogo; 
TextView textName; 
ImageView webButton; 
ImageView phoneButton; 
ImageView favoriteButton; 
Context context; 
Company currentCompany; 



public ViewHolder(View row, Context context){ 
    theLogo = (ImageView) row.findViewById(R.id.imageLogo); 
    textName = (TextView) row.findViewById(R.id.textName); 
    webButton = (ImageView) row.findViewById(R.id.imageWeb); 
    phoneButton = (ImageView) row.findViewById(R.id.imagePhone); 
    favoriteButton = (ImageView) row.findViewById(R.id.imageStar); 

    theLogo.setImageResource(R.drawable.no_pic); 


    this.context = context; 


} 

public void setIcon(Bitmap icon) 
{ 

    try { 
     if(icon == null) { 
      theLogo.setImageResource(R.drawable.no_pic); 
     } else { 
      theLogo.setImageBitmap(icon); 
     } 
    } catch(Exception e) {} 

} 

public void populateFrom(Company oneCompany,CachedLogoDownloader logos){ 

    currentCompany = oneCompany; 

    Bitmap tIcon = logos.getLogo(this); 

    try { 
     if(tIcon == null) { 
      theLogo.setImageResource(R.drawable.no_pic); 
     } else { 
      theLogo.setImageBitmap(tIcon); 
     } 
    } catch(Exception e) {} 


    //create listener for favorite star icon thingy 
    favoriteButton.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 

     //...code removed... 
     } 
    }); 

    //set company name 
    textName.setText(currentCompany.getName()); 

    //resolve web button visibility 
    if(!currentCompany.getWeb().equals("")) { 
     webButton.setVisibility(View.VISIBLE); 
     webButton.setOnClickListener(new OnClickListener() { 
      public void onClick(View arg0) { 
       //...code removed... 
      } 
     }); 
    } 
    else { 
     webButton.setVisibility(View.GONE); 
    } 

    //resolve phone button visibility 
    if(!currentCompany.getPhone().equals("")) { 
     phoneButton.setVisibility(View.VISIBLE); 
     phoneButton.setOnClickListener(new OnClickListener() { 
      public void onClick(View arg0) { 
       //...code removed... 
      } 
     }); 
    } 
    else { 
     phoneButton.setVisibility(View.GONE); 
    } 


}}} 

답변

0

내가 아는 :
당신은 당신의 ViewHolder에만 convertView 경우 == 널 (null)를 인스턴스화합니다. 따라서 findViewById 호출은 ListViewItems를 화면 밖으로 참조하고 있습니다. 생성자 코드를 populateFrom에 넣는다면 모든 것이 잘되어야합니다.

+0

내 컴퓨터에는 아직 없지만 새로운 요소를 추가하기 전에 작동한다는 사실을 설명하지는 않습니까? 사용자 정의 요소는 여전히 올바르게 작동합니다. 즐겨 찾기 단추가 작동하고 아이콘이 계속 업데이트됩니다. 목록 항목을 클릭 할 수 없습니다. – Nyth

+0

방금 ​​시도했습니다. 전혀 효과가없는 것처럼 보였습니다. – Nyth

+0

로그를 추가하여 setOnClickListener가 설정되었는지 확인하고 트리거 된 경우 내부를 봅니다. onClick 메서드 내부의 무언가가 잘못되었을 수도 있습니다. 코드가 보이기 때문입니다. –

관련 문제