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 onLoadingStarted(String imageUri, View view) {
                holder.imageView.setImageBitmap(defaultBm);
            }

            @Override
            public void onLoadingFailed(String imageUri, View view, FailReason failReason) {

            }

            @Override
            public void onLoadingComplete(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 onLoadingCancelled(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 onLoadingComplete(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);
            }

        }
    }

}
原文地址:https://www.cnblogs.com/niray/p/4007853.html