2014-07-21 3 views
0

내 맞춤 목록을 채우기 위해이 CustomAdapter가 있습니다. 문제는 Imageview가 다운로드되고 많은 시간을 소비한다는 것입니다. 예 :맞춤 어댑터 반복

내 서버에 동영상의 목록을 검색 :

(Video1) Title 1 Description 1 

(Video2) Title 2 Description 2 

(Video3) Title 3 Description 3 

.. 

때이 부하의 비디오 1로드에서 이미지, 각 비디오에 대한 다시 같은 이미지 뷰의 Video2Image 부하 및에 목록, 동영상이 목록에있는 것과 같은 시간. 어댑터를 스크롤하면 모든 이미지가 다시 다운로드됩니다. 이 문제를 해결할 수있는 몇 가지 옵션이 있습니다.

CustomAdapter.java

public class CustomAdapter extends ArrayAdapter<Video> { 
    // declaring our ArrayList of items 
    private ArrayList<Video> objects; 

    public CustomAdapter(Context context, int textViewResourceId, ArrayList<Video> objects) { 
     super(context, textViewResourceId, objects); 
     this.objects = objects; 
    } 

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

     View v = convertView; 

     if (v == null) { 
      LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = inflater.inflate(R.layout.list_row, null); 
     } 

     Video i = objects.get(position); 

     if (i != null) { 

      TextView title = (TextView) v.findViewById(R.id.title); 
      TextView description = (TextView) v.findViewById(R.id.description); 
      ImageView imagen = (ImageView) v.findViewById(R.id.list_image); 

      title.setText(i.getTitulo()); 
      description.setText(i.getDescripcion()); 

      //Creamos imagen descargada y la seteamos 
      new DownloadImageTask(imagen).execute(i.getUrlimagen()); 
      BitmapDrawable drawable = (BitmapDrawable) imagen.getDrawable(); 
      Bitmap bitmap = drawable.getBitmap(); 
      imagen.setImageBitmap(bitmap); 

      Log.i("Debug", "Creando una imagen para: " + i.getTitulo()); 

      v.setTag(R.id.id_url, i.getUrl().trim());//1.Url 
      v.setTag(R.id.id_titulo,i.getTitulo().trim());//2.Título 
      v.setTag(R.id.id_video,i.getId().trim());//3.ID 

     } 

     return v; 

    } 

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

     public DownloadImageTask(ImageView bmImage) { 
      this.bmImage = bmImage; 
     } 

     protected Bitmap doInBackground(String... urls) { 
      String urldisplay = urls[0]; 
      Bitmap mIcon11 = null; 
      try { 
       InputStream in = new java.net.URL(urldisplay).openStream(); 
       BitmapFactory BitmapFactory = null; 
       mIcon11 = BitmapFactory.decodeStream(in); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return mIcon11; 
     } 

     protected void onPostExecute(Bitmap result) { 
      if(result!=null) 
       bmImage.setImageBitmap(result); 
     } 
    } 

    public ArrayList getValues(){ 
     return objects; 
    } 

} 

내 영어 죄송합니다.

답변

1

나는 전에 대답하고 나는 너에게 다시 대답한다 : 바퀴를 다시 발명하지 마라!

이미지 다운로드/캐싱은 지금보고있는 이유 (메모리 관리, 캐시 관리 등)에있어 매우 복잡한 점으로, 작동하는 라이브러리 만 사용하면됩니다.

다음은

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

    View v = convertView; 

    if (v == null) { 
     LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     v = inflater.inflate(R.layout.list_row, null); 
    } 

    Video i = objects.get(position); 

    if (i != null) { 

     TextView title = (TextView) v.findViewById(R.id.title); 
     TextView description = (TextView) v.findViewById(R.id.description); 
     ImageView imagen = (ImageView) v.findViewById(R.id.list_image); 

     title.setText(i.getTitulo()); 
     description.setText(i.getDescripcion()); 

     //Creamos imagen descargada y la seteamos 
     Picasso 
      .with(imagen.getContext()) 
      .load(i.getUrlimagen()) 
      .into(imagen); 

     Log.i("Debug", "Creando una imagen para: " + i.getTitulo()); 

     v.setTag(R.id.id_url, i.getUrl().trim());//1.Url 
     v.setTag(R.id.id_titulo,i.getTitulo().trim());//2.Título 
     v.setTag(R.id.id_video,i.getId().trim());//3.ID 

    } 

    return v; 

} 

횟수 (안드로이드에 대한 나의 마음에 드는 이미지 다운로드 라이브러리) Picasso를 사용하여 코드입니다! 이 코드는 스레딩, 캐싱, 취소를 처리합니다.

ps : 좀 더 리싸이징 어댑터와 ViewHolder 패턴을 올바르게 읽어야합니다.

+0

좋은 작품! 그것의 아주 좋은 lib, 고마워! – Genaut

0

getview는 항상 DownloadImageTask를 생성합니다. 당신은 그렇게하고 싶지 않습니다. 이미 가지고 있는지 확인하고 싶지 않은 경우에만 새로운 것을 다운로드하고 싶을 것입니다.

1

나는이 문제를 오래 전에 가지고 있었다. getView()에 로그인하면 화면 끝을지나 스크롤 할 때마다 호출된다는 것을 알 수 있습니다. 이것은 스크롤 할 때 이미지가 여러 번 다운로드된다는 것을 의미합니다.

이 문제를 해결하려면 비트 맵을 캐시해야합니다. 캐시가 생기면 getView를 호출 할 때마다 먼저 캐시에 대한 쿼리를 수행하여 이미지가 이미 다운로드되었는지 여부를 확인한 다음 다운로드하여 캐시에 추가하십시오.

이 방법은 Android 개발자에게 (코드와 함께) 여기에 설명되어 있습니다. http://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

관련 문제