我正在开发社交应用程序,它即将完成,但我遇到了一个图像闪烁的问题。当屏幕上有大约9到10张图像时,如果我滚动页面,则会发生图像闪烁。
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
LayoutInflater inf = (LayoutInflater) act.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inf.inflate(R.layout.view_grid_explore, null);
holder = new ViewHolder();
holder.img = (ImageView) convertView.findViewById(R.id.img_grid_album);
} else {
holder = (ViewHolder) convertView.getTag();
}
ImageLoader.getInstance().displayImage(
Static_Urls.explore_pic + data.get(position).talk_pic,
holder.img);
convertView.setTag(holder);
notifyDataSetChanged();
return convertView;
}
答案 0 :(得分:0)
notifyDataSetChanged();
。这种情况正在发生,因为一旦UIL(通用图像加载器)将图像下载到设备中,它就会将图像缓存在内存和设备中。
使用此代码:
ImageLoader.getInstance().displayImage(Static_Urls.explore_pic +data.get(position).talk_pic,
holder.img);
每次调用getView()
时,UIL都会尝试从网络中获取图像,但是当它发布时,该图像已经被缓存,因此它会在首先发出网络请求后显示图像。
所以为了摆脱这种闪烁,使用这段代码:
ImageLoader imageLoader = ImageLoader.getInstance();
File file = imageLoader.getDiskCache().get(Static_Urls.explore_pic +data.get(position).talk_pic);
if (file==null) {
//Load image from network
imageLoader.displayImage(Static_Urls.explore_pic +data.get(position).talk_pic,
holder.img);
}
else {
//Load image from cache
holder.img.setImageURI(Uri.parse(file.getAbsolutePath()));
}
此代码首先检查图像是否已经缓存,然后相应地从网络或缓存中获取图像。
答案 1 :(得分:0)
notifyDataSetChanged()
行在那里是多余的。使用适配器始终要记住(如果适配器扩展BaseAdapter),getView()
方法负责膨胀列表项的布局,如果你处理它,也会更新UI(通常你这样做)< / p>
调用notifyDataSetChanged()
会立即再次调用getView()
,这就是您看到闪烁的原因。
当您想要更新适配器内容时,您应该只调用notifyDataSetChanged()
。一个例子是你在适配器中构建一个“refresh()”方法,如:
public void refresh(List<Object> list) {
data.clear();// Assuming data is a List<> object or an implementation of it like ArrayList();
data.addAll(list);
notifyDataSetChanged(); // This will let the adapter know that something changed in the adapter and this change should be reflected on the UI too, thus the getView() method will be called implicitly.
}