• 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);
                }
    
            }
        }
    
    }
  • 相关阅读:
    pandas属性和方法
    os模块常用方法
    读/写xlsx文件
    读/写docx文件
    文件基本用法
    jieba.lcut方法
    移动端设置input属性disabled样式
    移动端日期选择,下拉框选择效果
    css背景色渐变代码
    拖动div元素
  • 原文地址:https://www.cnblogs.com/niray/p/4007853.html
Copyright © 2020-2023  润新知