zoukankan      html  css  js  c++  java
  • 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);
                }
    
            }
        }
    
    }
  • 相关阅读:
    172. Factorial Trailing Zeroes
    96. Unique Binary Search Trees
    95. Unique Binary Search Trees II
    91. Decode Ways
    LeetCode 328 奇偶链表
    LeetCode 72 编辑距离
    LeetCode 226 翻转二叉树
    LeetCode 79单词搜索
    LeetCode 198 打家劫舍
    LeetCode 504 七进制数
  • 原文地址:https://www.cnblogs.com/niray/p/4007853.html
Copyright © 2011-2022 走看看