0

내 목록보기의 모든 행에 다른 이미지를로드하는 중, 여러 가지 자습서를 살펴본 후 가장 좋은 방법으로 Google 비디오를 보았지만 여전히 작동하지 않습니다. 정확히. 내 목록보기 항목은 슬라이드 쇼의 모든 이미지를 표시하며 내 목록을 스크롤하면 변경됩니다.목록보기의 이미지를로드 할 때 제대로 작동하지 않습니다.

유니버설 이미지 로더를 사용하여 이미지를 다운로드하고 캐시합니다. 내 전체 클래스에 대한 내 코드는 다음과 같습니다. 나는 단지 이것을 작동시키지 않는 것 같다.

public class EventAdapter extends ArrayAdapter<EventDetails>{ 

private Context context; 
LayoutInflater inflater; 
LinkedList<EventDetails> event_details; 
ImageView event_imge; 
ViewHolder holder; 
public ImageLoader imageLoader; 


public EventAdapter(Context mcontext, 
     LinkedList<EventDetails> m_event_details) { 
    super(mcontext, R.layout.event_list_row, m_event_details); 

    this.context = mcontext; 
    this.event_details = new LinkedList<EventDetails>(); 
    this.event_details = m_event_details; 
} 

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

    View v = myview; 

    if (inflater == null) { 
     inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    if (v == null) { 
     v = inflater.inflate(R.layout.event_list_row, parent, 
       false); 
     imageLoader = ImageLoader.getInstance(); 
     holder = new ViewHolder(); 
     holder.event_name = (TextView) v.findViewById(R.id.event_name); 
     holder.event_show = (TextView) v.findViewById(R.id.event_show); 
     holder.event_time = (TextView) v.findViewById(R.id.event_time); 
     holder.event_date = (TextView) v.findViewById(R.id.event_date); 
     holder.event_genre = (TextView) v.findViewById(R.id.event_genre); 
     holder.event_price = (TextView) v.findViewById(R.id.event_price); 
     holder.img = (ImageView) v.findViewById(R.id.event_image); 
     holder.event_ll = (LinearLayout) v.findViewById(R.id.event_frame_ll); 

     v.setTag(holder); 
    }else{ 
     holder = (ViewHolder) v.getTag(); 
    } 

    final EventDetails eD = event_details.get(position); 
    if(eD != null){ 
     holder.event_name.setText(eD.name.toUpperCase()); 
     holder.event_show.setText(eD.show.toUpperCase()); 
     holder.event_time.setText(eD.time.toUpperCase()); 
     holder.event_date.setText(eD.date.toUpperCase()); 
     holder.event_price.setText("£"+String.format("%.2f", eD.price)); 
     holder.event_genre.setText(eD.genre.toUpperCase()); 

     if(eD.isStandBy == 0){ 
      holder.event_ll.setVisibility(View.GONE); 
     }else{ 
      holder.event_ll.setVisibility(View.VISIBLE); 
     } 

     holder.img.setTag(eD.image_url[0]); 
     if(MemoryCacheUtil.findCachedBitmapsForImageUri(eD.image_url[0], ImageLoader.getInstance().getMemoryCache()).size() > 0){ 
      //holder.img.setBackgroundDrawable(new BitmapDrawable(MemoryCacheUtil.findCachedBitmapsForImageUri(eD.image_url[0], ImageLoader.getInstance().getMemoryCache()).get(0))); 
      holder.img.setImageBitmap(MemoryCacheUtil.findCachedBitmapsForImageUri(event_details.get(position).image_url[0], ImageLoader.getInstance().getMemoryCache()).get(0)); 

     }else{    
      DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true).build(); 
      ImageLoader.getInstance().loadImage(eD.image_url[0], options, new SimpleImageLoadingListener() {        

       @Override 
       public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
        //holder.img.setBackgroundDrawable(new BitmapDrawable(loadedImage)); 
        holder.img.setImageBitmap(loadedImage); 
       } 
      }); 
     } 
    }  

    return v; 
} 

static class ViewHolder{ 

    TextView event_name; 
    TextView event_show; 
    TextView event_time; 
    TextView event_date; 
    TextView event_genre; 
    TextView event_price; 
    ImageView img; 
    LinearLayout event_ll; 
} 

답변

0

holder은 클래스 변수입니다. 그래서 각각의 재생 된 견해에 첨부 된 홀더의 인스턴스가 하나뿐입니다. 이것은 효과가있다.

또한 항목을 저장하는 데 LinkedList을 사용하지 마십시오. LinkedList의 액세스 시간은 O(n)입니다. 대신 ArrayList을 사용하십시오.

public View getView(int position, View myview, ViewGroup parent) { 
    ViewHolder holder; 

    View v = myview; 

    if (inflater == null) { 
     inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    if (v == null) { 
     v = inflater.inflate(R.layout.event_list_row, parent, 
       false); 

     imageLoader = ImageLoader.getInstance(); 
     holder = new ViewHolder(); 
     holder.event_name = (TextView) v.findViewById(R.id.event_name); 
     holder.event_show = (TextView) v.findViewById(R.id.event_show); 
     holder.event_time = (TextView) v.findViewById(R.id.event_time); 
     holder.event_date = (TextView) v.findViewById(R.id.event_date); 
     holder.event_genre = (TextView) v.findViewById(R.id.event_genre); 
     holder.event_price = (TextView) v.findViewById(R.id.event_price); 
     holder.img = (ImageView) v.findViewById(R.id.event_image); 
     holder.event_ll = (LinearLayout) v.findViewById(R.id.event_frame_ll); 

     v.setTag(holder); 
    }else{ 
     holder = (ViewHolder) v.getTag(); 
    } 

    final EventDetails eD = event_details.get(position); 
    if(eD != null){ 
     holder.event_name.setText(eD.name.toUpperCase()); 
     holder.event_show.setText(eD.show.toUpperCase()); 
     holder.event_time.setText(eD.time.toUpperCase()); 
     holder.event_date.setText(eD.date.toUpperCase()); 
     holder.event_price.setText("£"+String.format("%.2f", eD.price)); 
     holder.event_genre.setText(eD.genre.toUpperCase()); 

     if(eD.isStandBy == 0){ 
      holder.event_ll.setVisibility(View.GONE); 
     }else{ 
      holder.event_ll.setVisibility(View.VISIBLE); 
     } 

     holder.img.setTag(eD.image_url[0]); 
     if(MemoryCacheUtil.findCachedBitmapsForImageUri(eD.image_url[0], ImageLoader.getInstance().getMemoryCache()).size() > 0){ 
      //holder.img.setBackgroundDrawable(new BitmapDrawable(MemoryCacheUtil.findCachedBitmapsForImageUri(eD.image_url[0], ImageLoader.getInstance().getMemoryCache()).get(0))); 
      holder.img.setImageBitmap(MemoryCacheUtil.findCachedBitmapsForImageUri(event_details.get(position).image_url[0], ImageLoader.getInstance().getMemoryCache()).get(0)); 

     }else{    
      DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true).build(); 
      ImageLoader.getInstance().loadImage(eD.image_url[0], options, new SimpleImageLoadingListener() {        

       @Override 
       public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
        //holder.img.setBackgroundDrawable(new BitmapDrawable(loadedImage)); 
        holder.img.setImageBitmap(loadedImage); 
       } 
      }); 
     } 
    }  

    return v; 
} 
+0

이것은 슬라이드 쇼 효과를 해결하는 것으로 보이지만 스크롤하는 동안 두 개의 이미지가 변경되며 대개 화면의 맨 위와 맨 아래에 표시됩니다. ViewHolder 클래스를 getView에서 final로 정의해야만 onDownloadFinished의 holder.img에 표시 될 수 있습니다. – Amanni

+1

다른 문제는 내 캐시 된 이미지를 캐싱하고 검색하는 것과 같습니다. – Amanni

+0

'inflater == null'을 체크하지 않고 단지 뷰를 팽창 시키면 뷰를 새로 고침 할 것이다. – Brandon