2012-04-13 4 views
0

私はスレッドで画像をダウンロードして表示するアプリを持っています。すべてがうまくいきます。しかし、画像がロードされると、同じ画像が2〜3箇所に読み込まれ、画面をスクロールすると画像が正しくロードされます。あなたの誰もがこれに何か示唆を与えることができますか?Android:画像のダウンロードに関する問題

コード:

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); 
} 
+0

:あなたがここにコードを投稿する前に、あなたは例えば、それは「きれい」にすることができhttp://www.prettyprinter.deを使用するには読めない(またはEclipseの使用SHIFT + CTRL + Fで)でした – Selvin

+0

あなたのためにこれすべてを処理するライブラリがあります:https:/ /github.com/DHuckaby/Prime – HandlerExploit

答えて

0

リストビューを使用していますか?そうであれば、その中にイメージを書き込む時点までに、ListView(別のリスト項目を表示するために再利用)によってビューが既にリサイクルされている可能性がありますか?あなたはgetView()方法で画像をロードするためのコードを書かれているので、

+0

はい私がリストactivtyを使用しています –

+0

もhttp://www.youtube.com/watch?v=wDBM6wVEO70とhttp://stackoverflow.com/questions/541966/android-howを参照してください。リストア中の画像の読み込みを遅らせる/ 3068012#3068012。注:WebImageViewは、http://brainflush.wordpress.com/2009/11/23/droid-fu-part-2-webimageview-and-webgalleryadapter/ –

0

問題が起こります。

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

だからそれは全く貧しいないことをお勧めします。

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

だけcouldntの任意のコードスニペットを貼り付け、私が何を示して何を、慎重に読んで実装しようと、カントは何かを理解していればask..sorry気軽にしてくださいするための手順..

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 
+0

に記載されています。ここでは、getviewから削除した後にこのコードを挿入する必要があります() 方法。行の画像の位置を設定するにはどうすればよいですか? –

+0

@sravanthiVが答えを更新しました。 – MKJParekh

関連する問題