내 어댑터의 getView 메소드 내부의 뷰에 이미지를로드하는 비동기 태스크를 구현하려고하는 listview가 있습니다. 그러나이 문제를 해결하는 데 성공했습니다. 내 문제는 listview 및 어댑터에서 뷰가 재활용되면서 사용자가 listview를 스크롤하여 레이아웃에있는 imageView가 뷰의 이미지를 보여주는 짧은 시간입니다. 이전 위치. 그런 다음 올바른 이미지를 보여줍니다. 비동기 작업이 호출되기 전에 getView 메서드 내에서 imageView 비트 맵을 null로 설정하려고했지만 여전히 동일하게 동작합니다. 이미지로드가 완료되기 전에 이전 이미지가 표시되지 않고 비동기 작업을 사용하여 이미지를 뷰에로드하려면 어떻게합니까?안드로이드리스트 뷰 비동기 이미지 로딩
2
A
답변
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을 사용하기 시작했습니다. 매우 간단하고 완벽하게 이미지 뷰를 처리합니다!
관련 문제
- 1. 안드로이드리스트 뷰 위젯 asyncron 이미지 로딩
- 2. 안드로이드리스트 뷰 이미지 크기
- 3. 뷰 페이지 및 비동기 로딩
- 4. 클릭하면 안드로이드리스트 뷰 변경 이미지
- 5. 안드로이드리스트 뷰 이미지 뷰잉 좌절
- 6. 안드로이드리스트 뷰 셀 이미지 잘림
- 7. 이미지 비동기 로딩
- 8. 비동기 이미지 로딩 jquery
- 9. 안드로이드리스트 뷰
- 10. 안드로이드리스트 뷰
- 11. 안드로이드리스트 뷰
- 12. 안드로이드리스트 뷰에서이 구축 이미지 뷰와 텍스트 뷰
- 13. "_Problem 로딩 위젯"이미지 뷰
- 14. 안드로이드리스트 뷰 ArrayAdapter 예제
- 15. 안드로이드리스트 뷰 센터 선택
- 16. 안드로이드리스트 뷰 (ArrayList 포함)
- 17. 안드로이드리스트 뷰 푸터보기
- 18. 안드로이드리스트 뷰 - 다양한 색상
- 19. 안드로이드리스트 뷰 스크롤 가능
- 20. 안드로이드리스트 뷰 ArrayAdapter 오류
- 21. 안드로이드리스트 뷰 액션 리스너
- 22. 동적으로 안드로이드리스트 뷰 작성
- 23. 안드로이드리스트 뷰 섹션 헤더
- 24. 안드로이드리스트 뷰 행 애니메이션
- 25. 안드로이드리스트 뷰 도움말
- 26. 안드로이드리스트 뷰 루핑
- 27. 안드로이드리스트 뷰 자동
- 28. 안드로이드리스트 뷰 데이터베이스보다
- 29. 안드로이드리스트 뷰 포커스
- 30. 안드로이드리스트 뷰 스크롤 스크롤
https://github.com/nostra13/Android-Universal-Image-Loader – VenomVendor
@VenomVendor Im 실제로 사용하고 있습니다. 그것은 여전히 나에게 동일한 결과를 준다 – superuserdo
당신은 어디에서 서버에서 그 이미지를 얻을 수 있습니까? – Saveen