2012-02-20 16 views
2

urlを使用してバックグラウンドプロセスからイメージを取得しています。dispalyイメージには、リスト内のすべてのイメージを表示するためにBaseAdapterを使用しました。リストビューにBaseAdapterを追加しました。URLを使用してカスタムベースアダプターに画像をダウンロードするにはどうすればよいですか?

AsyncTaskクラスを使用してバックグラウンドでイメージをダウンロードすることができます。このクラスはビットマップイメージを返すことができます。

次のようにMyCustomeアダプタクラスを実装しました。実装から

public class CustomeAdapter extends BaseAdapter { 
private static ArrayList<Message> searchArrayList; 

private LayoutInflater mInflater; 

public CustomeAdapter(Context context, ArrayList<Message> results) { 
    searchArrayList = results; 
    mInflater = LayoutInflater.from(context); 




} 

public int getCount() { 
    return searchArrayList.size(); 
} 

public Object getItem(int position) { 
    return searchArrayList.get(position); 
} 

public long getItemId(int position) { 
    return position; 
} 

public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if (convertView == null) { 
    convertView = mInflater.inflate(R.layout.list, null); 
    holder = new ViewHolder(); 
    holder.personName = (TextView) convertView.findViewById(R.id.usrName); 
    holder.message = (TextView) convertView.findViewById(R.id.msgText); 
    holder.imgPerson = (ImageView) convertView.findViewById(R.id.personImg); 
    holder.msgImg = (ImageView) convertView.findViewById(R.id.msgImg); 

    convertView.setTag(holder); 
    } else { 
    holder = (ViewHolder) convertView.getTag(); 
    } 

    holder.personName.setText(searchArrayList.get(position).getShoutUserFirstName()); 
    holder.message.setText(searchArrayList.get(position).getShoutMessageText()); 
    holder.msgImg.setImageResource(R.drawable.smile); 

    try{ 

    new DownloadImageTask(holder.imgPerson).execute("http://www.bwappstore.com/WebApps/ShoutImage/Image.ashx?UserID="+searchArrayList.get(position).getShoutUserID()); 

    } 
    catch (RejectedExecutionException e) { 
    e.printStackTrace(); 
} 
    return convertView; 
} 

static class ViewHolder { 
    TextView personName; 
    TextView message; 
ImageView imgPerson; 
ImageView msgImg; 

} 


private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { 
     ImageView bmImage; 

     public DownloadImageTask(ImageView bmImage) { 
      this.bmImage = bmImage; 
     } 
     protected Bitmap doInBackground(String... urls) { 
      Bitmap bm = null; 
      try { 
       URL aURL = new URL(urls[0]); 
       URLConnection conn = aURL.openConnection(); 
       conn.connect(); 
       InputStream is = conn.getInputStream(); 
       BufferedInputStream bis = new BufferedInputStream(is); 
       bm = BitmapFactory.decodeStream(bis); 
       bis.close(); 
       is.close(); 
      } 
      catch (IOException e) { 
       Log.e("", "Error getting bitmap", e); 
      } 
      return bm; 
     } 

     protected void onPostExecute(Bitmap result) { 
      bmImage.setImageBitmap(result); 
     } 
} 

} 

私は、画像をダウンロードすることができ、私はリストビューに表示することができますが、私はそれらをすべてfixing.those画像上で何度も何度とロードの上にロードされているわけではないが、ロードされていないスクロールすると画像が変化しています関連するメッセージ画像 1つの画像が読み込まれた場合、再び読み込まれることはありません。何度か1つの画像しかリストに表示されません。

一度に1つの画像を読み込んでリストに表示するにはどうすればよいですか? 体を助けてください

+2

ここでは、[** Android - ListView **の画像の遅延読み込み]を実装するための簡単なデモです(http://stackoverflow.com/a/3068012/379693) –

+0

他の方法がありますか? –

+0

lazy listは実装が難しいverryです –

答えて

1

問題はあなたのロジックにあります。

あなたは、リストをスクロールするたびに呼び出されるアダプタのgetViewメソッドで、ダウンロードイメージタスクを実行しています。

あなたのアクティビティがListActivityの場合は、タスクをonStartメソッドで実行してみてください。その後、この問題は見られません。

1

ここにはa nice libraryがあります。著者は、メモリリークと性能に逆らって戦ったと語った。このライブラリを最初に見てください。

関連する問題