0

スレッドに画像をダウンロードして表示するアプリがあります。すべてが正常に機能しています。しかし、画像が読み込まれると、同じ画像が 2 ~ 3 か所に読み込まれ、スクロールすると画面の画像が正しく読み込まれます。あなたの誰かがこれに何か提案をすることができますか?

コード:

try{
    holder.progress.setVisibility(View.VISIBLE);
    DownLoadImageInAThreadHandler(Item, holder);

}
catch(Exception e)
{
    System.out.println("Exception in Downloading image : " + e.getMessage());
}
return convertView;
}


//This code is outside the getview method
public void DownLoadImageInAThreadHandler(final CategoryData Item, final ViewHolder holder)
{
    nImageDownLoads++;

    System.out.println("The images being downloaded :" + nImageDownLoads);

    final Handler handler = new Handler()
    {
        @Override  public void handleMessage(Message message)
        {
            holder.imgitem.setImageDrawable((Drawable) message.obj);
            holder.imgitem.setVisibility(View.VISIBLE);
            holder.progress.setVisibility(View.GONE);
        }
    };
    //Thread for downloading the images
    Thread t = new Thread()
    {
        public void run()
        {
            try
            {
                Item.bImageDownLoaded = 2;
                System.out.println("Downloading image      :"+Item.ImageUrl);
                drawable=getDrawableFromUrl(Item.ImageUrl);
                nImageDownLoads--;
                System.out.println("Downloaded image :" + Item.ImageUrl);
                System.out.println("Remaining images for downloading: " + nImageDownLoads);
                if(drawable != null)
                {                                                          
                    Item.bImageDownLoaded = 1;
                    //Send the message to the handler
                    Message message = handler.obtainMessage(1, drawable);
                    handler.sendMessage(message);
                }
                else{
                    int idNoImage = R.drawable.giftsuggestionsnoimage;
                    Drawable dwgNoImg = getParent().getResources().getDrawable(idNoImage);

                    //Send the message to the handler
                    Message message = handler.obtainMessage(1, dwgNoImg);
                    handler.sendMessage(message);
                }
            }
            catch(Exception exp)
            {
                System.out.println("Exception in DownLoadImageInAThread : " + exp.getMessage());
            }
        }

        private Drawable getDrawableFromUrl(String imageUrl) throws IOException
        {
            try
            {
                image = DownloadDrawable(imageUrl, "src");
                //bmp = readBitmapFromNetwork(new URL(imageUrl));
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
            return image;
            //return bmp;
        }
    };
    t.start();
}

Drawable DownloadDrawable(String url, String src_name) throws java.io.IOException
{
    return Drawable.createFromStream(((java.io.InputStream) new java.net.URL(url).getContent()),  src_name);
}
4

2 に答える 2

0

リストビューを使用していますか? もしそうなら、そのビューに画像を書き込むまでに、そのビューがすでに ListView によってリサイクルされている (別のリスト項目を表示するために再利用されている) 可能性はありますか?

于 2012-04-13T12:14:50.057 に答える
0

メソッドで画像をロードするコードを記述したために問題が発生しますgetView()

そして、そのメソッドは、リストをスクロールするたびに呼び出されます。

ですから、それは貧弱で、まったく良い考えではありません。

そこからそのコードを削除します..画像をロードし、他のthreadまたは次にあなたのオブジェクトAsyncTask を呼び出します。notifyDataSetChanged()Adapter class

私が指示したことの手順です。注意深く読んで実装してみてください。理解できない場合は、お気軽にお問い合わせください..申し訳ありませんが、コードスニペットを貼り付けることができませんでした..

ListView アダプターの getView() メソッド

show default icon if array doesn't contain bitmap at that position
if bitmap is there show bitmap else show default icon

AsyncTask to Load Data

do in background
load data and show in listview

AsyncTask to Load Images

do in background
download images one bye one from the urls got in first AsyncTask
in onPostExecute call adapter's notifyDataSetChanged() to show the bitmaps too

you can also call onProgressUpdate periodically means..after 2-3 image download 
call publishProgress in doInBackground which will call onProgressUpdate and 
in that method also write adpater.notifyDataSetChanged() to 
reflect currently downloaded/available bitmaps in array
于 2012-04-13T12:15:44.187 に答える