2014-11-07 3 views
2

내 어댑터의 getView 메소드 내부의 뷰에 이미지를로드하는 비동기 태스크를 구현하려고하는 listview가 있습니다. 그러나이 문제를 해결하는 데 성공했습니다. 내 문제는 listview 및 어댑터에서 뷰가 재활용되면서 사용자가 listview를 스크롤하여 레이아웃에있는 imageView가 뷰의 이미지를 보여주는 짧은 시간입니다. 이전 위치. 그런 다음 올바른 이미지를 보여줍니다. 비동기 작업이 호출되기 전에 getView 메서드 내에서 imageView 비트 맵을 null로 설정하려고했지만 여전히 동일하게 동작합니다. 이미지로드가 완료되기 전에 이전 이미지가 표시되지 않고 비동기 작업을 사용하여 이미지를 뷰에로드하려면 어떻게합니까?안드로이드리스트 뷰 비동기 이미지 로딩

+0

https://github.com/nostra13/Android-Universal-Image-Loader – VenomVendor

+0

@VenomVendor Im 실제로 사용하고 있습니다. 그것은 여전히 ​​나에게 동일한 결과를 준다 – superuserdo

+0

당신은 어디에서 서버에서 그 이미지를 얻을 수 있습니까? – Saveen

답변

1

헤이 프로젝트

OnImageDownloaded.java

public class OnImageDownloaded { 

public OnImageDownloaded() { 
    try { 
     if (Environment.getExternalStorageState().equals(
       Environment.MEDIA_MOUNTED)) { 
      File file = new File(Environment.getExternalStorageDirectory() 
        .getAbsolutePath() + File.separator + "your_Dir_name"); 
      if (file.mkdirs()) { 
      } 
     } else { 
      Log.e("testing", "External Directory is not mounted"); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public void downloadTheImages(ArrayList<String> imageUrls) { 
    try { 
     new downloadingTheImages(imageUrls).execute(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

class downloadingTheImages extends AsyncTask<Void, Void, Void> { 
    ArrayList<String> imageUrls; 

    public downloadingTheImages(ArrayList<String> imageUrls) { 
     this.imageUrls = imageUrls; 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      for (int i = 0; i < imageUrls.size(); i++) { 
       if (imageUrls.get(i).equals("0")) { 
       } else 
        downloadTheImageIfRequired(imageUrls.get(i)); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

public void downloadTheImageIfRequired(String imageName) { 
    try { 
     String dirPath = Environment.getExternalStorageDirectory() 
       .getAbsolutePath() 
       + File.separator 
       + "your_Dir_name" 
       + File.separator; 
     String CompleteFilePath = dirPath + imageName; 
     File f = new File(CompleteFilePath); 
     if (f.exists()) { 
     } else { 
      URL url = new URL(
        "http image URL ::" 
          + imageName); 
      URLConnection conexion = url.openConnection(); 
      conexion.connect(); 

      InputStream input = new BufferedInputStream(url.openStream()); 
      OutputStream output = new FileOutputStream(CompleteFilePath); 
      byte data[] = new byte[1024]; 
      int count; 
      while ((count = input.read(data)) != -1) { 
       output.write(data, 0, count); 
      } 
      output.flush(); 
      output.close(); 
      input.close(); 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

}

를 귀하의 목록보기에

1 단계 메이크업이 클래스를 서버와 쇼에서 이미지를 다운로드하기 위해 몇 단계를 따라

2 단계.

t 이미지

private class getImage extends AsyncTask<Void, Void, String> { 
    Dialog dialog; 
    String url; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

    } 

    @Override 
    protected String doInBackground(Void... params) { 
     url = getResources().getString(R.string.baseurl) + "getNews"; 

     JSONParser jParser = new JSONParser(); 
     String json = jParser.getJSONFromUrl(url); 
     try { 
      JSONObject jobject = new JSONObject(json); 
      Log.e("testing", "url: " + url + " " + json); 
      int success = jobject.getInt("success"); 
      Log.e("testing", "json length" + jobject.length()); 
      for (int i = 0; i < jobject.length() - 1; i++) { 
       JSONObject jobj = jobject 
         .getJSONObject(Integer.toString(i)); 
       if (success == 1) { 
        HashMap<String, String> hm = new HashMap<String, String>(); 
        ArrayList<String> tempAl1 = new ArrayList<String>(); 

        tempAl1.add(jobj.getString("image")); 
        if (tempAl1.size() > 0) { 
         new OnImageDownloaded().downloadTheImages(tempAl1); 
        } 

        Log.e("test", "image" + jobj.getString("image")); 

        hm.put(image, jobj.getString("image")); 

        aldata.add(hm); 
       } 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
     if (dialog != null) 
      if (dialog.isShowing()) 
       dialog.dismiss(); 
     Custom_Adapter adapter = new Custom_Adapter (
       (Activity) context, aldata); 
     lv.setAdapter(adapter); 
    } 
} 

3 단계

표시이

전화와 같은 어댑터에서 해당 이미지 adaper

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    View view = convertView; 
    view = null; 
    if (view == null) { 
     LayoutInflater inflator = context.getLayoutInflater(); 
     view = inflator.inflate(R.layout.news_view, null); 
     final ViewHolder viewHolder = new ViewHolder(); 
     initAll(view, viewHolder); 
     view.setTag(viewHolder); 
    } 
    ViewHolder holder = (ViewHolder) view.getTag(); 
    fillAll(holder, position); 
    return view; 

} 

public void fillAll(final ViewHolder holder, final int position) { 

    String dirPath = Environment.getExternalStorageDirectory() 
      .getAbsolutePath() 
      + File.separator 
      + "your_Dir_name" 
      + File.separator; 
    String CompleteFilePath = dirPath + allData.get(position).get("image"); 
    File f = new File(CompleteFilePath); 
    if (f.exists()) { 
     Log.e("testingTag", "if part"); 
     holder.ivimage.setVisibility(View.VISIBLE); 
     catchOutOfMemory(holder.ivimage, CompleteFilePath); 
    } else { 
     Log.e("testingTag", "else part"); 
     holder.ivimage.setVisibility(View.GONE); 
    } 

    Log.e("test", "image" + allData.get(position).get("image")); 



} 

void catchOutOfMemory(ImageView iv, String path) { 
    try { 
     iv.setImageURI(Uri.parse(path)); 
    } catch (OutOfMemoryError e) { 
     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inSampleSize = 8; 
     Bitmap preview_bitmap = BitmapFactory.decodeFile(path, options); 
     iv.setImageBitmap(preview_bitmap); 
    } 
} 

그게 전부에서의 getView에서 이러한 방법 덕분

0

어댑터에서 ViewHolder를 사용하여 뷰를 효과적으로 재활용하고 태그를 설정해야합니다. (보기에서)보기를 올바른 이미지에 바인드합니다. getView (...) 콜백의 위치를 ​​이미 알고 있습니다.

1

똑같은 문제가 있었는데 Square의 Picasso을 사용하기 시작했습니다. 매우 간단하고 완벽하게 이미지 뷰를 처리합니다!