2011-07-27 7 views
0

ListViewに問題があります。問題は、リストから項目をクリックすると、すべての要素がその位置を変更していることです。私はBaseAdapterを拡張するListViewAdapterを作成し、getViewでは、AsyncTaskが(これはonCreate()の最後に呼び出される)ProgressBarで設定されたアイテムのpublic static ArrayListからデータを取得します。 ListViewは新しいアダプタを1回だけ使用します。アダプタ上でnotifyDataSetChanged()メソッドもinvalidate()も使用していません。項目のArrayListは、どこからでもコードから変更されません。デバッガのおかげで、itemは、ListViewから新しいActivityのonCreate()の最初の行の前に、onItemClick()メソッド(3つの行だけが新しいIntentを宣言し、extrasとstartActivity()を宣言する)を終了した後に再配置されることがわかります。私はその問題の理由をどこから探すべきかわかりません。助言がありますか?どのようなソースコードがここに役立つでしょうか?あなたは異なる要素(良いこと)のためのビューのを再利用しているが、あなたのViewHolderオブジェクトの参照がまだ前の要素オブジェクトへの参照を保持しますAndroid ListViewがonItemClickの後に変更されます

public View getView(int position, View convertView, ViewGroup parent) { 
      ViewHolder holder; 
      if (convertView == null) { 
       convertView = mInflater.inflate(R.layout.trophies_listitem, null); 
       holder = new ViewHolder(); 

       holder.text = (TextView) convertView.findViewById(R.id.TrophiesListItemName); 
       holder.text2 = (TextView) convertView.findViewById(R.id.TrophiesListItemSpecies); 
       holder.text3 = (TextView) convertView.findViewById(R.id.TrophiesListItemWeigth); 
       holder.text4 = (TextView) convertView.findViewById(R.id.TrophiesListItemJagdrevier); 
       holder.photo = (ImageView) convertView.findViewById(R.id.TrophiesListItemPhoto); 
       holder.label1 = (TextView) convertView.findViewById(R.id.TrophiesListLabel1); 
       convertView.setTag(holder); 
      } 
      else { 
       holder = (ViewHolder) convertView.getTag(); 
       return convertView; 
      } 

      DownloadedTrophy t = (DownloadedTrophy) trophies.get(position); 
      holder.text.setText(t.getTrophy_title()); 
      if(t.getTrophy_species()!=null && t.getTrophy_species().length()>0 && Integer.parseInt(t.getTrophy_species())>0) 
       holder.text2.setText(Main.mSpecies.getItemByKeyValue("id", String.valueOf(Integer.valueOf(t.getTrophy_species()) - 1)).get("name"));  
      holder.text3.setText(t.getTrophy_weight()); 
      holder.text4.setText(t.getTrophy_place()); 

      byte [] picture = t.getPictureSmall(); 
      if(picture!=null){ 
       Bitmap bm = BitmapFactory.decodeByteArray(picture, 0, picture.length); 
       holder.photo.setImageBitmap(bm); 
       } else { 
        Bitmap bm; 
        bm = BitmapFactory.decodeResource(res,R.drawable.trophy_none); 
        holder.photo.setImageBitmap(bm); 
       } 

      holder.label1.setText("Ort:"); 

      return convertView; 
      } 
+0

オーバーライドされたgetViewメソッドが便利です。 –

答えて

1

はここgetViewメソッド()です。それを再発見するほうがよいでしょう。

+0

「再検索する」とはどういう意味ですか? convertView.findViewById()を作成するすべてのgetView()について? – Seraphis

+0

はい、ViewHolderを使用せず、毎回convertView.findXを呼び出してください。または、ViewHolderなどの値を持つ要素IDをキーとする辞書を使用してください。 –

+0

私は正確な理由を見つけました: "return convertView" from else statement。今、私はそのコードから画像をダウンロードして削除する必要があります:-)たくさんありがとう! – Seraphis

関連する問題