Android 当显示图像时,ListView滚动滞后?

Android 当显示图像时,ListView滚动滞后?,android,listview,scroll,lag,Android,Listview,Scroll,Lag,滚动时,我的listview滞后。看起来懒洋洋的工作方式很有效,但每次显示图像时都会出现延迟 我正在使用此处找到的imageLoader,这是我的适配器: public class EventAdapter extends ArrayAdapter<Event>{ public ListImageLoader imageLoader; public DisplayImageOptions imgDispOpts; private ArrayList<E

滚动时,我的listview滞后。看起来懒洋洋的工作方式很有效,但每次显示图像时都会出现延迟

我正在使用此处找到的imageLoader,这是我的适配器:

public class EventAdapter extends ArrayAdapter<Event>{
    public ListImageLoader imageLoader; 
    public DisplayImageOptions imgDispOpts;
    private ArrayList<Event> objects;

    public EventAdapter(Context context, int textViewResourceId, ArrayList<Event> objects,ListImageLoader imageLoader) {
        super(context, textViewResourceId, objects);
        this.objects = objects;
        this.imageLoader = imageLoader;
    }
    /*
     * we are overriding the getView method here - this is what defines how each
     * list item will look.
     */
        @SuppressLint("DefaultLocale")
        @Override
        public View getView(int position, View convertView, ViewGroup parent){
            Event event = objects.get(position);
            // assign the view we are converting to a local variable
            View v = convertView;
            ViewHolder holder;

            // first check to see if the view is null. if so, we have to inflate it.
            // to inflate it basically means to render, or show, the view.
            if (v == null) {
                LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = inflater.inflate(R.layout.list_row, null);
                System.out.println("new Viewholder");
                holder = new ViewHolder();
                holder.listTimeString = (TextView) v.findViewById(R.id.listTimeString);
                holder.date =(TextView) v.findViewById(R.id.Date);
                holder.title = (TextView) v.findViewById(R.id.title);
                holder.shortInfo = (TextView) v.findViewById(R.id.shortinfo);
                holder.ageIcon = (ImageView) v.findViewById(R.id.listAgeIcon);
                holder.thumb = (ImageView) v.findViewById(R.id.wideListImage);
                holder.header = (RelativeLayout) v.findViewById(R.id.headerLayout);
                holder.rowLayout = (RelativeLayout) v.findViewById(R.id.rowlayout);
                holder.listVenueIcon = (ImageView) v.findViewById(R.id.listVenueIcon);
                holder.eventRowLayout = (RelativeLayout) v.findViewById(R.id.eventrowlayout);
                v.setTag(holder);
            }
            else{
                holder = (ViewHolder) v.getTag();
            }
            /*
             * Recall that the variable position is sent in as an argument to this method.
             * The variable simply refers to the position of the current object in the list. (The ArrayAdapter
             * iterates through the list we sent it)
             * 
             * Therefore, i refers to the current Item object.
             */

            if (event != null) {

                // This is how you obtain a reference to the TextViews.
                // These TextViews are created in the XML files we defined.

                //SET FONTS
                Typeface tf = Typeface.createFromAsset(getContext().getAssets(), "fonts/myriad.otf");
                holder.title.setTypeface(tf);
                holder.shortInfo.setTypeface(tf);
                Typeface tf2 = Typeface.createFromAsset(getContext().getAssets(),"fonts/agencyr.ttf");
                holder.date.setTypeface(tf2);
                // check to see if each individual textview is null
                // if not, assign some text!
                if(event.isBig()){
                    //holder.rowLayout.getLayoutParams().height=230;
                    holder.shortInfo.setHeight(80);
                    holder.shortInfo.setMaxLines(5);
                    holder.shortInfo.setText(event.getInfo());
                }
                else{
                    //holder.rowLayout.getLayoutParams().height=125;
                    //holder.listVenueIcon.setImageResource(R.drawable.ikon_bar);
                    holder.shortInfo.setHeight(16);
                    holder.shortInfo.setMaxLines(1);
                    holder.shortInfo.setText(event.getInfo());
                }
                if(event.isClub()){
                    holder.listVenueIcon.setImageResource(R.drawable.ikon_klubb);
                }
                else{
                    holder.listVenueIcon.setImageResource(R.drawable.ikon_bar);

                }
                if (event.isNewDay()){
                    holder.date.setText(event.getDay().toUpperCase());
                    holder.header.setVisibility(View.VISIBLE);
                } else{
                    holder.header.setVisibility(View.GONE);
                }
                if (holder.title != null){
                    holder.title.setText(event.getHost().toUpperCase());
                }
                if(holder.ageIcon!= null){
                    switch(Integer.parseInt(event.getAge())){
                    case(19):
                        holder.ageIcon.setImageResource(R.drawable.event_info_19);
                        break;

                    ...
                    more cases
                    ...

                    case(30):
                        holder.ageIcon.setImageResource(R.drawable.event_info_30);
                        break;
                    default:
                        holder.ageIcon.setImageResource(R.drawable.event_info_18);
                        break;
                    }
                }
                if(holder.thumb != null){
                    imageLoader.DisplayImage(event.getThumbURL(), holder.thumb);
                }
                if(holder.listTimeString != null){
                    String tempTimeString = event.getStartTime() + " - " + event.getEndTime(); 
                    holder.listTimeString.setText(tempTimeString);
                }
            }

            // the view must be returned to our activity
            return v;

        }
        static class ViewHolder{
            RelativeLayout eventRowLayout;
            TextView listTimeString;
            TextView date;
            TextView title;
            TextView shortInfo;
            ImageView ageIcon;
            ImageView thumb;
            RelativeLayout header;
            RelativeLayout rowLayout;
            ImageView listVenueIcon;
        }
}
公共类EventAdapter扩展了ArrayAdapter{
公共列表图像加载器图像加载器;
公共显示图像选项imgDispOpts;
私有ArrayList对象;
公共事件适配器(上下文上下文、int textViewResourceId、ArrayList对象、ListImageLoader imageLoader){
超级(上下文、textViewResourceId、对象);
this.objects=对象;
this.imageLoader=imageLoader;
}
/*
*我们在这里重写getView方法-这就是定义每个
*列表项将显示。
*/
@SuppressLint(“DefaultLocale”)
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
Event=objects.get(位置);
//将要转换的视图指定为局部变量
视图v=转换视图;
视窗座;
//首先检查视图是否为空。如果是,我们必须将其充气。
//充气基本上意味着渲染或显示视图。
如果(v==null){
LayoutInflater充气器=(LayoutInflater)getContext().getSystemService(Context.LAYOUT\u充气器\u SERVICE);
v=充气机充气(R.layout.list_行,空);
System.out.println(“新视窗持有人”);
holder=新的ViewHolder();
holder.listTimeString=(TextView)v.findViewById(R.id.listTimeString);
holder.date=(TextView)v.findViewById(R.id.date);
holder.title=(TextView)v.findViewById(R.id.title);
holder.shortInfo=(TextView)v.findViewById(R.id.shortInfo);
holder.ageIcon=(ImageView)v.findViewById(R.id.listAgeIcon);
holder.thumb=(ImageView)v.findViewById(R.id.wideListImage);
holder.header=(相对长度)v.findViewById(R.id.headerLayout);
holder.rowLayout=(RelativeLayout)v.findViewById(R.id.rowLayout);
holder.listVenueIcon=(ImageView)v.findViewById(R.id.listVenueIcon);
holder.eventRowLayout=(RelativeLayout)v.findViewById(R.id.eventRowLayout);
v、 setTag(支架);
}
否则{
holder=(ViewHolder)v.getTag();
}
/*
*回想一下,变量位置作为参数发送到此方法。
*变量只是引用当前对象在列表中的位置。(ArrayAdapter
*遍历我们发送的列表)
* 
*因此,我引用了当前的Item对象。
*/
如果(事件!=null){
//这是获取对TextView的引用的方式。
//这些文本视图是在我们定义的XML文件中创建的。
//设置字体
Typeface tf=Typeface.createFromAsset(getContext().getAssets(),“fonts/myriad.otf”);
持有者。标题。设置字体(tf);
holder.shortInfo.setTypeface(tf);
Typeface tf2=Typeface.createFromAsset(getContext().getAssets(),“font/agencyr.ttf”);
holder.date.setTypeface(tf2);
//检查每个文本视图是否为空
//如果没有,请指定一些文本!
if(event.isBig()){
//holder.rowLayout.getLayoutParams().height=230;
支架短信息设置高度(80);
holder.shortInfo.setMaxLines(5);
holder.shortInfo.setText(event.getInfo());
}
否则{
//holder.rowLayout.getLayoutParams().height=125;
//holder.ListVenueCon.setImageResource(R.drawable.ikon_条);
保持架短信息设置高度(16);
holder.shortInfo.setMaxLines(1);
holder.shortInfo.setText(event.getInfo());
}
if(event.isClub()){
holder.listVenueIcon.setImageResource(R.drawable.ikon_klubb);
}
否则{
holder.ListVenueCon.setImageResource(R.drawable.ikon_条);
}
if(event.isNewDay()){
holder.date.setText(event.getDay().toUpperCase());
holder.header.setVisibility(视图可见);
}否则{
holder.header.setVisibility(视图已消失);
}
if(holder.title!=null){
holder.title.setText(event.getHost().toUpperCase());
}
if(holder.ageIcon!=null){
开关(Integer.parseInt(event.getAge())){
案件(19):
holder.ageIcon.setImageResource(R.drawable.event\u info\u 19);
打破
...
更多案例
...
案件(30):
holder.ageIcon.setImageResource(R.drawable.event\u info\u 30);
打破
违约:
holder.ageIcon.setImageResource(R.drawable.event\u info\u 18);
打破
}
}
if(holder.thumb!=null){
DisplayImage(event.getThumbURL(),holder.thumb);
}
if(holder.listTimeString!=null){
字符串TENTIMESTRING=event.getStartTime()+“-”+event.getEndTime();
holder.listTimeString.setText(TestTimeString);
}
}
//视图必须返回到我们的活动
返回v;
}
静止的
public void cacheImage(String url){
    Bitmap bmp = getBitmap(url);
    memoryCache.put(url, bmp);
}
public class EntryArrayAdapter extends ArrayAdapter<JSONObject> {
private final Context context;
private final ArrayList<JSONObject> values; 
private final LruCache<String, Bitmap> cache;

static class ViewHolder {
        public TextView title;
        public TextView city;
        public TextView outlet;
        public TextView service;
        public ImageView photo;
}

public EntryArrayAdapter(Context context, ArrayList<JSONObject> values) {
    super(context, R.layout.layout_list_item);
    this.context = context;
    this.values = values;

     final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);

        // Use 1/8th of the available memory for this memory cache.
        final int cacheSize = maxMemory / 8;

        cache = new LruCache<String, Bitmap>(cacheSize) {
            @Override
            protected int sizeOf(String key, Bitmap bitmap) {
                // The cache size will be measured in kilobytes rather than
                // number of items.
                return bitmap.getRowBytes() / 1024;
            }
        };
}

/* (non-Javadoc)
 * @see android.widget.ArrayAdapter#getCount()
 */
@Override
public int getCount() {     
    return values != null ? values.size() : 0;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View rowView = convertView;
    ViewHolder holder;

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

        rowView = inflater.inflate(R.layout.layout_list_item, parent, false);
        // set references
        holder = new ViewHolder();

        holder.title = (TextView) rowView.findViewById(R.id.titleText);
        holder.city = (TextView) rowView.findViewById(R.id.cityText);
        holder.outlet = (TextView) rowView.findViewById(R.id.outletText);
        holder.service = (TextView) rowView.findViewById(R.id.visaMasterText);      
        holder.photo = (ImageView) rowView.findViewById(R.id.itemImage);
        rowView.setTag(holder);
    }
    else {
        holder = (ViewHolder) rowView.getTag();
    }

    try {
        JSONObject obj = values.get(position);

        Bitmap bmp = getBitmapFromMemCache(obj.getString("id"));
        if (bmp == null) {
            bmp = BitmapHelper.decodeSampledBitmapFromResource(obj.getString("photo"), 96, 96);        
            addBitmapToMemoryCache(obj.getString("id"), bmp);
        }

        holder.title.setText(obj.getString("title"));
        holder.city.setText(obj.getString("city"));
        holder.outlet.setText(obj.getString("outlet"));
        holder.service.setText(obj.getString("service"));           
        holder.photo.setImageBitmap(bmp);


    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return rowView;
}

public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
    if (getBitmapFromMemCache(key) == null) {
        cache.put(key, bitmap);
    }
}

public Bitmap getBitmapFromMemCache(String key) {
    return cache.get(key);
}