2011-07-27 81 views
0

我有ListView的問題。事情是,當我點擊列表中的任何項目時,所有元素都在改變他們的位置。我已經使ListViewAdapter擴展了BaseAdapter,並在getView中從公共靜態ArrayList中獲取由AsyncTask與ProgressBar(在onCreate()的末尾調用)填充的項目的數據。 ListView只需要一次新的適配器。我在適配器上既沒有notifyDataSetChanged()方法也沒有任何種類的invalidate()。項目的ArrayList不會從代碼的任何地方更改。感謝調試器我知道,在完成onItemClick()方法(它只有三行:declare new Intent,extras和startActivity())之後,但在來自新Activity的onCreate()的第一行之前,項目將重新定位。我不知道在哪裏尋找這個問題的原因。有什麼建議麼?什麼樣的源代碼將在這裏幫助?Android ListView修改後onItemClick

這裏的getView():

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

你重用查看對不同的元素(一件好事),但你的ViewHolder對象的引用將仍然堅持以前的元素對象的引用。重新找到它們會更好(和工作)。

+0

「重新找到它們」是什麼意思?對於每個getView()使convertView.findViewById()? – Seraphis

+0

是的,不要每次都使用ViewHolder並調用convertView.findX。或者,使用一個帶有ViewHolder值的元素ID的字典。 –

+0

我找到了確切的原因:「return convertView」from else語句。現在我只需要從該代碼中刪除下載圖片:-)非常感謝! – Seraphis