3

とリストアイテムの行としてを作成してListViewいます。TextViewImageView

最初に、リストビュービューでローカルデータベースからデフォルトのアイテムupdate buttonをロードしています。サーバーからさらにアイテムをロードするために、リストビューの上部にがあります。

update buttonユーザーがiを押すと、サーバーからアイコンのURLとテキストAsyncTaskをプルするaが起動します。

ImageViewにアイコンをロードするには、ImageDownloaderのサンプルを使用していますが、問題は、ImageViewがViewHolderパターンの古いImageViewsbcozとオーバーラップしていることです。だから誰かが私が間違っていることを私に吐き出すことができますか?

これが私のListViewアダプタコードです

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

                ViewHolder holder;
                TemplateData data = (TemplateData) this.getItem( position );

                if(convertView == null){
                    LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    convertView=inflater.inflate(R.layout.text_template_default_row, parent, false);

                    holder = new ViewHolder();
                    holder.templateText = (TextView) convertView.findViewById(R.id.defText);
                    holder.templateIcon = (ImageView)convertView.findViewById(R.id.defIcon);
                    holder.templateTitle = (TextView) convertView.findViewById(R.id.defTitle);

                    convertView.setTag(holder);

                }else{

                    holder = (ViewHolder)convertView.getTag();

                }


                holder.templateText.setText(data.getText() );
                holder.templateTitle.setText(data.getTemplateTitle());

                //isImageLoading initially sets to false so that default items will use the 
               // resource ids , it gets falsed when AsyncTask finished load Images and update the 
               //adapter and at that time this adapter has to pic the image from ImageDowloader
                if(!isImageLoading)
                    data.setTemplateIconId(iconList[position]);


                //Has resource id but not icon url
                if(data.getTemplateIconId()!=0 && data.getTemplateIconUrl()==null ){

                    Log.d("Load icon ","Default Load");

                    holder.templateIcon.setBackgroundResource(data.getTemplateIconId());



                // does not has recource id so load url from server
                }else if(data.getTemplateIconUrl()!=null && data.getTemplateIconId()==0){


                    Log.d("Load icon ","From Server Load");

                    imageDownloader.download(data.getTemplateIconUrl(), (ImageView) holder.templateIcon);



                }




                    return convertView;

         }

iconListには、アプリケーション内の既存のアイコンのリソースIDが含まれています。さらに詳しい情報が必要な場合は、お気軽にお問い合わせください。

編集

これがスクリーンショットです

最初は、Android携帯にのみ保存されているデータベースからロードされている8つのテンプレートとそのアイコンがあります。その名前はテンプレート1からテンプレート6で始まります

デフォルトビュー

これで、ユーザーが更新ボタンを押すと、新しいテンプレートがここに読み込まれます。その名前はtemplatenew1からtemplatenew9で始まりますが、上下にスクロールするとimageViewsがオーバーラップします

これがスクリーンショットです

ここに画像の説明を入力してください

4

1 に答える 1

4

あなたが最初にを呼び出している間に、あなたがあなたのimageDownloaderを呼び出しているsetImageResource(または同等の-それはsrc属性を設定している)と思われます。それは重複を説明するでしょう。ImageViewsetBackgroundResource

あなたがする必要があるのは、次のコードでに変更setBackgroundResourceすることです:setImageResource

 if(data.getTemplateIconId()!=0 && data.getTemplateIconUrl()==null ){

                Log.d("Load icon ","Default Load");

                // This line should say setImageResource:
                holder.templateIcon.setBackgroundResource(data.getTemplateIconId());
 } else ... 

@Akosが言及している問題(彼は削除したようです)は、ダウンロードに時間がかかり、ビューがすでに再利用されている場合に問題になります。彼が述べたことを言い換えると、上記のソリューションを介してこれを機能させると、画像のダウンロードに長い時間がかかる場合(行がすでに再利用され、新しい画像セットが設定されている限り)、画像が古い画像で上書きされます。

したがって、imageDownloaderダウンロードする前に、あなたの内部も言いたいでしょう:

imageView.setTag(url);

ダウンロードが完了した後、ImageView:に画像を設定する前に

if(!(String)imageView.getTag().equals(url)
{ 
     return; 
}

このように、ImageViewがその間に別の行によって再利用された場合、ダウンロードは単に中止されます。

于 2012-08-17T20:53:42.043 に答える