如何解决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);
} }
} }

android how to deal with data when listview refresh的更多相关文章

  1. android学习日记03--常用控件ListView

    常用控件 8.ListView 列表视图,比如游戏的排行榜.列表数据可以根据屏幕大小自适应 列表的显示需要三个元素: a.ListVeiw:用来展示列表的View. b.适配器:用来把数据映射到Lis ...

  2. Android图表库MPAndroidChart(十四)——在ListView种使用相同的图表

    Android图表库MPAndroidChart(十四)--在ListView种使用相同的图表 各位好久不见,最近挺忙的,所有博客更新的比较少,这里今天说个比较简单的图表,那就是在ListView中使 ...

  3. Android高级控件(一)——ListView绑定CheckBox实现全选,增加和删除等功能

    Android高级控件(一)--ListView绑定CheckBox实现全选,增加和删除等功能 这个控件还是挺复杂的,也是项目中应该算是比较常用的了,所以写了一个小Demo来讲讲,主要是自定义adap ...

  4. android 实现一个简单纯文本的ListView

    思维线路: 1.创建一个ListViewActivity,LinearLayout布局里写了一个ListView布局 2.创建一个TextView布局给ArrayAdapter适配器使用 3.将Tex ...

  5. Android高级控件(一)——ListView绑定CheckBox实现全选,添加和删除等功能

    Android高级控件(一)--ListView绑定CheckBox实现全选,添加和删除等功能 这个控件还是挺复杂的.也是项目中应该算是比較经常使用的了,所以写了一个小Demo来讲讲,主要是自己定义a ...

  6. Android 快速开发系列 打造万能的ListView GridView 适配器

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38902805 ,本文出自[张鸿洋的博客] 1.概述 相信做Android开发的写 ...

  7. Android获取程序路径 (/data/data/appname)

    Android获取文件夹路径 /data/data/ http://www.2cto.com/kf/201301/186614.html String printTxtPath = getApplic ...

  8. Android入门(五)UI-单位与尺寸、ListView

    原文链接:http://www.orlion.ga/453/ 一.单位与尺寸 布局文件中一共有以下单位供选择:px,pt,dp,sp px:是像素,屏幕中可见的最小元素单位. pt:是磅,1磅等于1/ ...

  9. android 项目学习随笔十二(ListView加脚布局)

    1.ListView加脚布局 头布局initHeaderView,在onTouchEvent事件中进行显示隐藏头布局切换 脚布局initFooterView,实现接口OnScrollListener, ...

随机推荐

  1. CentOS 7 下挂载NTFS文件系统并实行开机自动挂载

    CentOS 7 下想要挂载NTFS的文件系统该怎么办呢? 我们需要一个NTFS-3G工具,并编译它之后在mount就可以了,就这么简单. 首先要进入官网下载NTFS-3G工具 http://www. ...

  2. LINK : fatal error LNK1104

    今天本来想试试opencv的,于是就在自己的机子上部署一下试试,结果一直遇到这个错误:LINK : fatal error LNK1104 环境:win7 64位 vs2012 opencv 2.4. ...

  3. 解决Error: That port is already in use.

    ubuntu系统下,运行一个django项目,即输入python manage.py runserver后,可能出现 Error: That port is already in use.的错误. 即 ...

  4. Unity3D学习(十一):关于UI销毁后图集仍然无法释放问题的解决办法

    前言 最近进行项目性能优化的时候发现的问题. 问题 从大厅进到单局的过程中,会经过选择英雄和加载两个流程,这两个流程对应的UI界面都会有一张几mb左右的贴图作为背景,在进入单局游戏后这两个UI已经销毁 ...

  5. spring中事务传播解读:PROPAGATION_REQUIRES_NEW

    第一步:获取事务状态,判断当前事务线程是否存在.第二步:如果当前事务的传播行为为PROPAGATION_REQUIRES_NEW,挂起当前线程绑定的事务,取消当前事务的sessionHolder和co ...

  6. 基于HTML5自定义文字背景生成QQ签名档

    分享一款利用HTML5实现的自定义文字背景应用,首先我们可以输入需要显示的文字,并且为该文字选择一张背景图片,背景图片就像蒙版一样覆盖在文字上.点击生成QQ签名档即可将文字背景融为一体生成另外一张图片 ...

  7. 微信APP支付 - C#

    最近挺忙的,没时间写东西.然后在弄微信APP支付,网上的搜索一趟,都比较凌乱,我也遇到一些坑,不过也算弄好了,记录分享一下. 1.准备各种调用接口需要的参数,配置app.config. <!-- ...

  8. 从此sudo不再输密码

    #sudo visudo 最后一次输入密码. 在最后一行加入: xxx ALL=NOPASSWD: ALL xxx即为你当前使用的用户名,Ctrl+X,保存退出. 从此告别每次都要输密码的时代.

  9. 正向工程、逆向工程与MDA

    正向工程.逆向工程与MDA 正向工程:从UML图形生成代码: 逆向工程:从代码和成UML图形: //不要依赖于正向或逆向工程,仅是一种辅助手段.画图的目的不是为了生成代码:而写代码的目的也不是为了生成 ...

  10. Python 资料性网站。

    伯乐在线:http://blog.jobbole.com/category/python/ http://blog.chinaunix.net/uid/22334392/cid-24327-list- ...