ArrayAdapter가있는 ListView에서 이미지를 추가하려고합니다. Fyi에서 toList()는 iterator에서 주어진 DBObject의리스트로의 변환이다.ListView 어댑터에서 비트 맵/이미지로드
나는 View getView()
을 덮어 쓰고 텍스트 뷰와 이미지를 설정합니다.
private static class EventAdapter extends ArrayAdapter<DBObject> {
public EventAdapter(Context context, int resource, Iterable<DBObject> events) {
super(context, resource, toList(events));
}
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
LayoutInflater vi = LayoutInflater.from(getContext());
v = vi.inflate(R.layout.adapter_event_list, null);
DBObject event = getItem(position);
if (event != null) {
//Get the logo if any
if(((DBObject)event.get("events")).containsField("logo")){
String logoURL = ((DBObject)((DBObject)event.get("events")).get("logo")).get("0").toString();
ImageView eventLogo = (ImageView) v.findViewById(R.id.eventLogoList);
new setLogo().execute(logoURL, eventLogo);
}
TextView title= (TextView) v.findViewById(R.id.eventTitleList);
title.setText(((DBObject)event.get("events")).get("title").toString());
}
return v;
}
protected static <T> List<T> toList(Iterable<T> objects) {
final ArrayList<T> list = new ArrayList<T>();
for(T t : objects) list.add(t);
return list;
}
//setLogo() method here. See below
}
텍스트 뷰의 텍스트는 정상입니다. 그러나 이미지가 엉망이되고있다. 그들은 목록의 잘못된 위치에로드하는 것 같습니다. 코드의 경로는 다음과 같습니다. 1) DB (비동기)에서 가져 오기 2) 각 이미지로드 (두 번째 비동기)를 채우는 동안 ListView 3) 채우기. 내가 그렇게
private class setLogo extends AsyncTask<Object,Void,Bitmap>{
ImageView eventLogo = null;
@Override
protected Bitmap doInBackground(Object...params) {
try{
Bitmap eventImage = downloadBitmap((String) params[0]);
eventLogo = (ImageView) params[1];
return eventImage;
}
catch(Exception e){
e.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(Bitmap eventImage) {
if(eventImage!=null && eventLogo!=null){
eventLogo.setImageBitmap(eventImage);
}
}
}
내가 URL의 이미지를로드하는 올바른 방법이라고 생각 (비동기 사용) :
다음은 위의 EventAdapter
내부에있는 setLogo()
AsyncTask를합니다. 이 post on multithreading을 보았고 downloadBitmap()
방법을 빌 렸습니다.
위에서 설명한대로 이미지는 ListView의 잘못된 위치에로드됩니다. 그들을 로딩 할 수있는 강력한 방법은 무엇일까?
또한 AsyncTask 안에 v.findViewById(R.id.eventLogoList)
을 전달하는 아이디어는 프로그램이 각 어댑터의 ImageView를 구별 할 수 있지만 보이지 않는 것 같습니다.
내가 this SO question 발견이 혼합의 원인이되는 문제를 다음과 후 업데이트
.
if
이 문제를 일으키는 지 확인하기 위해 코드를 변경했습니다.
//Get the logo if any
if(((DBObject)event.get("events")).containsField("logo")){
String logoURL = ((DBObject)((DBObject)event.get("events")).get("logo")).get("0").toString();
ImageView eventLogo = (ImageView) row.findViewById(R.id.eventLogoList);
//new setLogo().execute(logoURL, eventLogo);
TextView title= (TextView) row.findViewById(R.id.eventTitleList);
title.setText("Shit happens");
}
40 개의 항목이 있다고 가정 해 보겠습니다. 은 logo
필드가있는 필드에 설정됩니다. 아래로 스크롤하면 주문이 변경되고 텍스트가 엉망이됩니다. 그것은 루프 내부에서 생성 된 스택이 목록의 최대 값보다 작기 때문입니다. 아마도 ... 나는 여전히 고심하고 있습니다.
추신 : 012Y가 아닌 이미지를 비동기 적으로로드하려면 this easy library이 발견되었습니다.
업데이트 2
나는 정적 URL을 가진 다른 사람을 추가했습니다. 이미지를로드하는 데 시간이 걸리기 때문에 여전히 위치가 잘못되었습니다.
라이브러리를 사용해 주셔서 감사합니다.하지만 콘텐츠는 여전히 혼란 스럽습니다. – Diolor