2013-06-05 19 views
7

Używam uniwersalnego programu ładującego obrazy do wyświetlania obrazów kciuka w widoku listy. Zaimplementowałem podstawowe kroki w adapterze i wszystko działa. Problem polega na tym, że mam 10 pozycji na liście i widzę pierwszych 5, jak tylko przewijam w dół nowe obrazy są wyświetlane, ale kiedy przewijam do góry, obrazy są zastępowane ponownie raz, co chcę, to pierwsze 5 obrazów, które są pokazane na początku, nie należy ich zastępować. Tak więc, kiedy przewijam w górę iw dół, obrazy nie są zastępowane raz za razem.ListView podobnie jak w uniwersalnej aplikacji przykładowego programu ładującego obrazki

Tak jak w przypadku przykładowej aplikacji ListActivity, obrazy po załadowaniu nie są zastępowane podczas przewijania w górę.

Oto kod

klasy Application

public class MyApplication extends Application { 

@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    super.onCreate(); 

    // Create default options which will be used for every 
    // displayImage(...) call if no options will be passed to this method 
    DisplayImageOptions displayimageOptions = new DisplayImageOptions.Builder().cacheInMemory().cacheOnDisc().build(); 


    // Create global configuration and initialize ImageLoader with this configuration 
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()). 
      defaultDisplayImageOptions(displayimageOptions).build(); 
    ImageLoader.getInstance().init(config); 
} 
} 

Adapter

public class CarListAdapter extends BaseAdapter { 

private ArrayList<CarDetail> items = new ArrayList<CarDetail>(); 
private Context context; 
private ImageLoader imageLoader; 
private ImageLoadingListener animateFirstDisplayListener; 



public CarListAdapter(Context context , ArrayList<CarDetail> items , ImageLoadingListener animateFirstDisplayListener) { 
    super(); 
    this.context = context; 
    this.items = items; 
    this.animateFirstDisplayListener = animateFirstDisplayListener; 
    imageLoader = ImageLoader.getInstance(); 
    imageLoader.init(ImageLoaderConfiguration.createDefault(context)); 

} 

@Override 
public int getCount() { 
    // TODO Auto-generated method stub 
    return items.size(); 
} 

@Override 
public Object getItem(int position) { 
    // TODO Auto-generated method stub 
    return items.get(position); 
} 

@Override 
public long getItemId(int position) { 
    // TODO Auto-generated method stub 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    // TODO Auto-generated method stub 
    Log.d("Inside", "GetView"); 

    LayoutInflater mInflater = (LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
    ViewHolder holder = null; 
    final CarDetail car = items.get(position); 


    if (convertView == null) { 

      convertView = mInflater.inflate(R.layout.car_list_row, parent , false); 
      holder = new ViewHolder(); 
      holder.tvCarName = (TextView) convertView.findViewById(R.id.tvCarName); 
      holder.tvDailyPriceValue = (TextView) convertView.findViewById(R.id.tvDailyPriceValue); 
      holder.tvWeeklyPriceValue = (TextView) convertView.findViewById(R.id.tvWeeklyPriceValue); 
      holder.tvWeekendPriceValue = (TextView) convertView.findViewById(R.id.tvWeekendPriceValue); 
      holder.imgCar = (ImageView) convertView.findViewById(R.id.imgCar); 
      holder.btnBookNow = (Button) convertView.findViewById(R.id.btnBookNow); 

      holder.btnBookNow.setFocusable(false); 
      holder.btnBookNow.setFocusableInTouchMode(false); 

      holder.btnBookNow.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View arg0) { 
        // TODO Auto-generated method stub 
        Intent intent = new Intent(context , BookingFormActivity.class); 
        intent.putExtra("car_name", car.getCarName()); 
        intent.putExtra("min_age", car.getMinimumAge()); 
        context.startActivity(intent); 
       } 
      }); 

      convertView.setTag(holder); 
    } 
    else { 

     holder = (ViewHolder) convertView.getTag(); 
     } 

    holder.tvCarName.setText(car.getCarName()); 
    holder.tvDailyPriceValue.setText(car.getDailyPrice()); 
    holder.tvWeeklyPriceValue.setText(car.getWeeklyPrice()); 
    holder.tvWeekendPriceValue.setText(car.getWeekendPrice()); 
    imageLoader.displayImage(car.getThumbUrl(), holder.imgCar, animateFirstDisplayListener); 


    return convertView; 
} 

static class ViewHolder { 

      TextView tvCarName; 
      TextView tvDailyPriceValue; 
      TextView tvWeeklyPriceValue; 
      TextView tvWeekendPriceValue; 
      ImageView imgCar; 
      Button btnBookNow; 
     } 




} 
+0

Proponuję użyć leniwy listy adapter – blganesh101

+0

dowolny link byłoby pomocne – Ravi

Odpowiedz

5

Dwa razy dzwonisz pod numer init(), a drugie wywołanie zastępuje opcje buforowania. Usuń tej linii:

imageLoader.init(ImageLoaderConfiguration.createDefault(context)); 
+0

, który zgłasza wyjątek: java.lang.IllegalStateException: ImageLoader musi być init z konfiguracją przed użyciem – Ravi

+0

Oznacza to, że twoje pierwsze 'init()' w twojej klasie aplikacji 'onCreate()' nie jest być nazwanym. czy twoja "MojaAplikacja.java" zdefiniowana jako klasa aplikacji w manifeście? – Nachi

+0

Podzięka człowiek nie zadeklarowałem tego w manifeście, mój zły .. – Ravi

1

Zastosowanie Lazy Listadapter to jest łatwe i efektywne Link poniżej https://github.com/thest1/LazyList/blob/master/src/com/fedorvlasov/lazylist/LazyAdapter.java

+0

widziałem link nie zrobił spróbować, ale to działa, ponieważ nie robi recyklingu poglądy, więc nie będę się tym problemem, choć to nie jest pamięć wydajna. W każdym razie dzięki – Ravi

+0

ta próbka nie otrzyma obrazu z linku. Dlaczego tak się stanie? I debugowałem go w pamięci podręcznej pamięci – alicanbatur

Powiązane problemy