在android中闪烁的图像

时间:2016-01-23 13:08:34

标签: android android-layout listview android-fragments android-intent

我正在开发社交应用程序,它即将完成,但我遇到了一个图像闪烁的问题。当屏幕上有大约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;
}

2 个答案:

答案 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.
}