1

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을 가진 다른 사람을 추가했습니다. 이미지를로드하는 데 시간이 걸리기 때문에 여전히 위치가 잘못되었습니다.

답변

0

필자는 Picasso와 같은 좋은 도서관에 갈 것입니다. 그것은 당신을 위해 모든 어려운 부분을 처리 할 것이고 아주 잘 쓰여 있습니다. http://square.github.io/picasso/

+0

라이브러리를 사용해 주셔서 감사합니다.하지만 콘텐츠는 여전히 혼란 스럽습니다. – Diolor

관련 문제