2016-05-06 17 views
1

ListViewにアダプタを持つアイテムを表示したいのですが、getViewがArrayAdapterで呼び出されたときに、スクロールしても良いイメージは表示されますが、正常なアイテムは表示されません。 findViewByIdが私にレイアウトの良いIDを与えていないかのようです。Android ListView getView表示イメージをランダムに

if(pack.getImageName().equals("null")){ 
     holder.imageView.setImageBitmap(null); 
    } 

しかし、私はListViewコントロールにスクロールしていたとき、私は間違った項目に画像を見ることができる、と私がgetViewメソッドを呼び出すために再びスクロールする必要が:

public class ItemPackAdapter extends ArrayAdapter<Pack> { 
Context context; 

public ItemPackAdapter(Context context, ArrayList<Pack> pack) { 
    super(context, 0, pack); 
    this.context = context; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    // Check if an existing view is being reused, otherwise inflate the view 
    final Pack pack = getItem(position); 
    if (convertView == null) { 
     convertView = LayoutInflater.from(context).inflate(R.layout.item_pack, parent, false); 
     holder = new ViewHolder(); 
     holder.textView1 = (TextView) convertView.findViewById(R.id.textView1); 
     holder.textView2 = (TextView) convertView.findViewById(R.id.textView2); 
     holder.textView3 = (TextView) convertView.findViewById(R.id.textView3); 
     holder.imageView = (ImageView) convertView.findViewById(R.id.imageView); 
     if (!pack.getImageName().equals("null")) { 
      UrlGenerator urlGenerator = new UrlGenerator(); 
      String url = urlGenerator.getDownloadPicture(pack.getImageName()); 
      DownloadPicture downloadPicture = new DownloadPicture(holder.imageView, url, getContext()); 
      downloadPicture.start(); 
     } 
     convertView.setTag(holder); 
    } 
    else { 
     holder = (ViewHolder)convertView.getTag(); 
    } 
    holder.textView1.setText(pack.getSomething1()); 
    holder.textView2.setText(pack.getSomething2()); 
    holder.textView3.setText(pack.getSomething3()); 
    if (!pack.getImageName().equals("null")) { 
     UrlGenerator urlGenerator = new UrlGenerator(); 
     String url = urlGenerator.getDownloadPicture(pack.getImageName()); 
     DownloadPicture downloadPicture = new DownloadPicture(holder.imageView, url, getContext()); 
     downloadPicture.start(); 
    } 
    if(pack.getImageName().equals("null")){ 
     holder.imageView.setImageBitmap(null); 
    } 
    return convertView; 
} 
static class ViewHolder { 
    TextView textView1; 
    TextView textView2; 
    TextView textView3; 
    ImageView imageView; 
} 
} 

は実際に私がして解決策を見つけました前の状態の画像を削除してください。 私は何かきれいにしたい:p

ありがとうございます。 そして、私の悪い英語を申し訳ありません。

+1

問題は、ビューのリサイクルによるものです。この問題を避けるには、 'Picasso'や他のイメージローディングライブラリを使うことができます。 –

答えて

0

下に示すように、あなたはこの問題のようにあなたを与える可能性があり、あなたのイメージをキャッシュしていない場合、私はここではあなたのコードを編集します。 Picassoライブラリを使用することを強くお勧めします。プロジェクトにpicassoライブラリを追加して、このようなコードを書いてください。

Picasso.with(getApplicationContext()).load(url).into(holder.imageView); 

の代わりに、このライン

DownloadPicture downloadPicture = new DownloadPicture(holder.imageView, url, getContext()); 
downloadPicture.start(); 
+0

私はこのライブラリを知らなかった、ありがとう – gfitas

1

あなたのコードの外観はちょっとした微調整でうまくいくでしょう。私はあなたが二回ImageViewの設定されたことを発見し、その

public class ItemPackAdapter extends ArrayAdapter<Pack> { 
    Context context; 
    ArrayList<Pack> packs; 

    public ItemPackAdapter(Context context, ArrayList<Pack> packs) { 
     super(context, 0, packs); 
     this.context = context; 
     this.packs = packs; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     // Check if an existing view is being reused, otherwise inflate the view 
     final Pack pack = packs.get(position); 
     if (convertView == null) { 
      convertView = LayoutInflater.from(context).inflate(R.layout.item_pack, parent, false); 
      holder = new ViewHolder(); 
      holder.textView1 = (TextView) convertView.findViewById(R.id.textView1); 
      holder.textView2 = (TextView) convertView.findViewById(R.id.textView2); 
      holder.textView3 = (TextView) convertView.findViewById(R.id.textView3); 
      holder.imageView = (ImageView) convertView.findViewById(R.id.imageView); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     if (pack.getImageName().equals("null")) { 
      holder.imageView.setImageBitmap(null); 
     } else { 
      UrlGenerator urlGenerator = new UrlGenerator(); 
      String url = urlGenerator.getDownloadPicture(pack.getImageName()); 
      DownloadPicture downloadPicture = new DownloadPicture(holder.imageView, url, getContext()); 
      downloadPicture.start(); 
     } 
     holder.textView1.setText(pack.getSomething1()); 
     holder.textView2.setText(pack.getSomething2()); 
     holder.textView3.setText(pack.getSomething3()); 

     return convertView; 
    } 

    static class ViewHolder { 
     TextView textView1; 
     TextView textView2; 
     TextView textView3; 
     ImageView imageView; 
    } 
} 
+0

Picassoライブラリを追加して、私のコードを変更しました。正常に動作することを知っています。ありがとうございます。 – gfitas

関連する問題