【问题标题】:Flickering images in ListView [duplicate]ListView中闪烁的图像[重复]
【发布时间】:2015-07-30 22:20:27
【问题描述】:

我正在尝试将图像从 URL 下载到列表视图中。当我滚动或列表填充图像时,图像会闪烁并且不在正确的行上..

这是我的适配器代码:

public class RecipesAdapter extends ArrayAdapter<XmlDataCollected> {
    // View lookup cache
    private static class ViewHolder {
        static ImageView img;
        TextView name;
        TextView info;
        ImageDownloader controller;
    }

    public RecipesAdapter(Context context, List<XmlDataCollected> recipes) {
        super(context, R.layout.fragment_search_result, recipes);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // Get the data item for this position
        XmlDataCollected recipe = getItem(position);
        // Check if an existing view is being reused, otherwise inflate the view
        ViewHolder viewHolder; // view lookup cache stored in tag
        if (convertView == null) {
            viewHolder = new ViewHolder();
            LayoutInflater inflater = LayoutInflater.from(getContext());
            convertView = inflater.inflate(R.layout.fragment_search_result, parent, false);
            viewHolder.name = (TextView) convertView.findViewById(R.id.label);
            viewHolder.info = (TextView) convertView.findViewById(R.id.info);
            ViewHolder.img = (ImageView) convertView.findViewById(R.id.icon);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
            viewHolder.img.setImageBitmap(null);
        }

        if (viewHolder.controller != null) {
            viewHolder.controller.cancel(false);
        }

        viewHolder.controller = new ImageDownloader(viewHolder.img);

        if (viewHolder.controller != null) {
            viewHolder.controller.execute(recipe.getImgUrl());
        }

        // Populate the data into the template view using the data object
        viewHolder.name.setText(recipe.getRecipeName());
        if(recipe.getType() != null) {
            viewHolder.info.setText(recipe.getType());
        }
        else {
            viewHolder.info.setText("Unknown category");
        }

        //new ImageDownloader(viewHolder.img).execute(recipe.getImgUrl());
        // Return the completed view to render on screen
        return convertView;
    }

    public class ImageDownloader extends AsyncTask<String, Void, Bitmap> {
        ImageView bmImage;

        public ImageDownloader(ImageView bmImage) {
            this.bmImage = bmImage;
        }

        protected Bitmap doInBackground(String... urls) {
            String url = urls[0];
            Bitmap mIcon = null;
            try {
                InputStream in = new java.net.URL(url).openStream();
                mIcon = BitmapFactory.decodeStream(in);
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
            }
            return mIcon;

        }

        protected void onPostExecute(Bitmap result) {
            if(result != null) {
                bmImage.setImageBitmap(result);
            }
            else{
                bmImage.setImageResource(R.drawable.ic_launcher);
            }
        }
    }
}

【问题讨论】:

标签: android listview flicker


【解决方案1】:

在您的 Listview xml 中
添加这个

android:cacheColorHint="#00000000"

或通过代码

 listView.setCacheColorHint(Color.TRANSPARENT);

也删除

viewHolder.img.setImageBitmap(null);

来自您的else 条件

【讨论】:

    【解决方案2】:

    我也有这个问题。在您的 getView() 方法中添加以下代码:

    if (viewHolder.controller != null) {
        viewHolder.controller.cancel(false);
    }
    
    viewHolder.controller = new ImageDownloader(viewHolder.img);
    
    if (viewHolder.controller != null) {
        viewHolder.controller.execute(recipe.getImgUrl());
    }
    

    【讨论】:

    • 如何使用这个控制器?它说“无法解析符号控制器”
    • 您必须将 ImageLoader controller; 添加到静态 ViewHolder 类中。
    • 问题依然存在,当我滚动图片时继续跳舞
    • 这很奇怪。您能否再次发布您的整个适配器,包括我上面提出的建议。那我稍后再看看你的问题。
    【解决方案3】:

    除了上述建议之外,我还有一些其他建议可能会有所帮助。

    您必须使您的 getView() 方法更加优化,因为它会为进入可见区域的每一行调用。将 if/else 条件更改为方法调用也可能会有所帮助。

    首先我建议你看看这个网站:

    http://leftshift.io/6-ways-to-make-your-lists-scroll-faster-than-the-wind

    如果您使用的是 wrap_content,则更改列表视图的高度以匹配父项的包装内容也会对优化产生巨大影响。您也可以尝试将其设为 0dp。它会产生相同的结果。

    如果您需要更多信息,请查看此线程以了解“match_parent”优化。

    Why is 0dp considered a performance enhancement?

    【讨论】:

      猜你喜欢
      • 2017-02-23
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 2010-10-29
      • 2010-10-21
      • 1970-01-01
      相关资源
      最近更新 更多