2011-11-10 5 views
0

カスタムListViewとアダプタを再構成してViewHolderクラスを利用した後、コードは当初動作していたようです。しかし、一番下までスクロールしてリストに項目を追加すると、リスト要素が突然クリックされなくなります。これは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:
あなただけconvertView == nullの場合は、あなたの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

私は問題がどこにあるか知っています。したがって、findViewByIdの呼び出しはListViewItemsを画面外に参照しています。あなたのコンストラクタコードをあなたのpopulateFromに入れたら、すべてがうまくいくはずです。

+0

今は自分のコンピュータではありませんが、それは新しい要素が追加される前に動作するという事実を説明しません。カスタム要素も正しく動作します。お気に入りボタンが機能し、アイコンが更新されます。リスト項目はクリックできません。 – Nyth

+0

これを試しました。何の効果もないようでした。 – Nyth

+0

ログを追加して、setOnClickListenerが設定されているかどうか、および内部がトリガーされているかどうかを確認してください。あなたのコードがvaklidのように見えるので、onClickメソッド内の何かが間違っている場合があります –

関連する問題