首页 > 代码库 > android how to deal with data when listview refresh

android how to deal with data when listview refresh

如何解决listview数据刷新,下拉刷新,上拉加载更多时,图片不闪烁。

在Activity的onResume()方法中将adaper和listView重新再绑定一次。
listView.setAdapter(adapter);adapter.notifyDataSetChanged();

 

 http://www.eoeandroid.com/forum.php?mod=viewthread&tid=541113&extra=&ordertype=1

public class HomeWaterfallXlListAdapter extends BaseAdapter {private Bitmap defaultBm;    private static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());    public HomeWaterfallXlListAdapter() {        defaultBm = BitmapFactory.decodeResource(mActivity.getResources(), R.drawable.loading);    }    /**刷新视图**/    public void setList(List<HomeAnswersJSONResult.Answer> list) {        this.answers = list;        notifyDataSetInvalidated();    }    /**加载更多**/    public void addList(List<HomeAnswersJSONResult.Answer> list) {        if (this.answers != null) {            this.answers.addAll(list);            notifyDataSetChanged();        } else {            setList(list);        }    }    @Override    public int getCount() {        return answers == null ? 0 : answers.size();    }    @Override    public Object getItem(int arg0) {        return answers.get(arg0);    }    @Override    public long getItemId(int arg0) {        return 0;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        Answer answer = answers.get(position);        final ViewHolder holder;        if (convertView == null) {            convertView = LayoutInflater.from(mActivity).inflate(R.layout.item_home_infos_list, null);            holder = new ViewHolder();            holder.imageView = (ScaleImageView) convertView.findViewById(R.id.starImg);            convertView.setTag(holder);        } else {            holder = (ViewHolder) convertView.getTag();        }        int w = answer.getImg().getWidth();        int h = answer.getImg().getHeight();        holder.imageView.setImageWidth(w);        holder.imageView.setImageHeight(h);        String imageUrl = answer.getImg().getUrl().toString() + "?w=" + AppActivity.screenWidth / 2;        holder.imageView.setTag(imageUrl);        imageLoader.loadImage(imageUrl, new ImageSize(w, h), options, new ImageLoadingListener() {            @Override            public void onl oadingStarted(String imageUri, View view) {                holder.imageView.setImageBitmap(defaultBm);            }            @Override            public void onl oadingFailed(String imageUri, View view, FailReason failReason) {            }            @Override            public void onl oadingComplete(String imageUri, View view, Bitmap loadedImage) {                if (loadedImage != null && imageUri.equals(holder.imageView.getTag())) {                    holder.imageView.setImageBitmap(loadedImage);                    boolean firstDisplay = !displayedImages.contains(imageUri);                    if (firstDisplay) {                        // 图片淡入效果                        AlphaAnimation fadeImage = new AlphaAnimation(0, 1);                        fadeImage.setDuration(500);                        fadeImage.setInterpolator(new DecelerateInterpolator());                        holder.imageView.startAnimation(fadeImage);                        displayedImages.add(imageUri);                    }                }            }            @Override            public void onl oadingCancelled(String imageUri, View view) {            }        }); convertView.setOnClickListener(new onItemClick(id));        return convertView;    }    static final class ViewHolder {        ScaleImageView imageView;    }    private class onItemClick implements View.OnClickListener {        private int id;        public onItemClick(int id) {            this.id = id;        }        @Override        public void onClick(View arg0) {            Intent intent = new Intent(mActivity, A.class);            intent.putExtra("answerId", id);            mActivity.startActivity(intent);        }    }    /**     * 图片加载第一次显示监听器     * @author Administrator     *     */    private static class AnimateFirstDisplayListener extends SimpleImageLoadingListener {        static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());        @Override        public void onl oadingComplete(String imageUri, View view, Bitmap loadedImage) {            if (loadedImage != null) {                ImageView imageView = (ImageView) view;                // 是否第一次显示                boolean firstDisplay = !displayedImages.contains(imageUri);                if (firstDisplay) {                    // 图片淡入效果                    FadeInBitmapDisplayer.animate(imageView, 500);                    displayedImages.add(imageUri);                }            }        }    }}

ScaleImageView

/** *  * This view will auto determine the width or height by determining if the * height or width is set and scale the other dimension depending on the images * dimension *  * This view also contains an ImageChangeListener which calls changed(boolean * isEmpty) once a change has been made to the ImageView *  * @author Maurycy Wojtowicz *  */public class ScaleImageView extends ImageView {    private Bitmap currentBitmap;    private ImageChangeListener imageChangeListener;    private boolean scaleToWidth = false; // this flag determines if should                                            // measure height manually dependent                                            // of width    public ScaleImageView(Context context) {        super(context);        init();    }    public ScaleImageView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        init();    }    public ScaleImageView(Context context, AttributeSet attrs) {        super(context, attrs);        init();    }    private void init() {        this.setScaleType(ScaleType.CENTER_INSIDE);    }    public void recycle() {        setImageBitmap(null);        if ((this.currentBitmap == null) || (this.currentBitmap.isRecycled()))            return;        this.currentBitmap.recycle();        this.currentBitmap = null;    }    @Override    public void setImageBitmap(Bitmap bm) {        currentBitmap = bm;        super.setImageBitmap(currentBitmap);        if (imageChangeListener != null)            imageChangeListener.changed((currentBitmap == null));    }    @Override    public void setImageDrawable(Drawable d) {        super.setImageDrawable(d);        if (imageChangeListener != null)            imageChangeListener.changed((d == null));    }    @Override    public void setImageResource(int id) {        super.setImageResource(id);    }    public interface ImageChangeListener {        // a callback for when a change has been made to this imageView        void changed(boolean isEmpty);    }    public ImageChangeListener getImageChangeListener() {        return imageChangeListener;    }    public void setImageChangeListener(ImageChangeListener imageChangeListener) {        this.imageChangeListener = imageChangeListener;    }    private int imageWidth;    private int imageHeight;    public void setImageWidth(int w) {        imageWidth = w;    }    public void setImageHeight(int h) {        imageHeight = h;    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        int widthMode = MeasureSpec.getMode(widthMeasureSpec);        int heightMode = MeasureSpec.getMode(heightMeasureSpec);        int width = MeasureSpec.getSize(widthMeasureSpec);        int height = MeasureSpec.getSize(heightMeasureSpec);        /**         * if both width and height are set scale width first. modify in future         * if necessary         */        if (widthMode == MeasureSpec.EXACTLY || widthMode == MeasureSpec.AT_MOST) {            scaleToWidth = true;        } else if (heightMode == MeasureSpec.EXACTLY || heightMode == MeasureSpec.AT_MOST) {            scaleToWidth = false;        } else            throw new IllegalStateException("width or height needs to be set to match_parent or a specific dimension");        if (imageWidth == 0) {            // nothing to measure            super.onMeasure(widthMeasureSpec, heightMeasureSpec);            return;        } else {            if (scaleToWidth) {                int iw = imageWidth;                int ih = imageHeight;                int heightC = width * ih / iw;                if (height > 0)                    if (heightC > height) {                        // dont let hegiht be greater then set max                        heightC = height;                        width = heightC * iw / ih;                    }                this.setScaleType(ScaleType.CENTER_CROP);                setMeasuredDimension(width, heightC);            } else {                // need to scale to height instead                int marg = 0;                if (getParent() != null) {                    if (getParent().getParent() != null) {                        marg += ((RelativeLayout) getParent().getParent()).getPaddingTop();                        marg += ((RelativeLayout) getParent().getParent()).getPaddingBottom();                    }                }                int iw = imageWidth;                int ih = imageHeight;                width = height * iw / ih;                height -= marg;                setMeasuredDimension(width, height);            }        }    }}

 

android how to deal with data when listview refresh