带有可绘制图像的ListView是滞后的

时间:2014-08-28 18:00:40

标签: java android android-listview

找到解决方案(谢谢你的答案!) 它是抽签的高文件大小(.PNG)

我的/ drawables文件夹中有listview和许多.png图像。当我在listview项目的imageview中加载这些图像时,listview的滚动会变得滞后

public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        ViewHolder holder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.drawer_list_item, null);
            holder = new ViewHolder();
            holder.title = (TextView) convertView.findViewById(R.id.title);
            holder.store_image = (ImageView) convertView.findViewById(R.id.store_image);
            convertView.setTag(holder);
        }
        else{
            holder = (ViewHolder) convertView.getTag();
        }

        holder.title.setText(stores[position]);
        switch(position){
                case 0: Picasso.with(context).load(R.drawable.first).into(holder.store_image);break;
                ///... more cases ...
                default: break;
                }
            }

        return convertView;

    }

我正在NavigationDrawer中实现它

修改

我也尝试了这种创建和绘制数组的方法,然后设置了imageview,但仍然是它的滞后。

//in the adapter
int[] store_images = new int[]{R.drawable.first,...and so on}; 
// and then in getView()
holder.store_image.setImageResource(store_images[position]);

5 个答案:

答案 0 :(得分:0)

已编辑的代码

试试这个代码!!

           ArrayList<Boolean> alDone= new   ArrayList<Boolean>();

                public View getView(final int position, View convertView, ViewGroup parent) {
                                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                                final ViewHolder holder;
                                if (convertView == null) {
                                    convertView = inflater.inflate(R.layout.drawer_list_item, null);
                                    holder = new ViewHolder();
                                    holder.title = (TextView) convertView.findViewById(R.id.title);
                                    holder.store_image = (ImageView) convertView.findViewById(R.id.store_image);
                                    convertView.setTag(holder);
                                }
                                else{
                                    holder = (ViewHolder) convertView.getTag();
                                }

                                holder.title.setText(stores[position]);

                               if(position==0){

                                if(!alDone.get(position)){
    Picasso.with(context).load(R.drawable.first).into(holder.store_image);
alDone.add(true,position)
        }
                    }
                                return convertView;

                            }

答案 1 :(得分:0)

您使用inflater的方式不正确。

试试这个:

 convertView = inflater.inflate(layoutResourceId, parent, false);

http://www.doubleencore.com/2013/05/layout-inflation-as-intended/

这可能有助于延迟。 Picasso是一个非常好的框架,会为你缓存图像,所以它可能不是原因。

祝你好运!

答案 2 :(得分:0)

好!所以问题是19kb的文件大小!我把文件大小减少到5-6kb,滞后就消失了!虽然如果你有同样的问题,我的答案也可能有帮助!

答案 3 :(得分:0)

滞后列表视图可能有很多原因:

  1. 您的xml布局:您使用RelativeLayout还是嵌套布局?然后在滚动时进行布局可能是问题所在。解决方案:平面布局
  2. 对我而言,您似乎尝试实现不同的视图类型。因此,将布局xml文件拆分为两个并定义两种视图类型。一个用于列表中的第一个元素,另一个用于其他元素。
  3. 你加载了很多图片吗?然后垃圾收集可能是问题,因为它将阻止UI线程,直到GC完成。检查logcat。在这里您可以找到GC运行的次数和所需的时间。正如我所见,你使用毕加索。有一个功能不是毕加索的一部分(仍然是拉请求)通过向ListView / RecyclerView添加OnScrollListener来处理这个问题:https://github.com/square/picasso/pull/561

答案 4 :(得分:0)

如果您没有从网上加载图片,请不要使用Picasso。你的代码:

Picasso.with(context).load(R.drawable.first).into(holder.store_image);

建议您已将图像存储在应用中,因此只需将它们直接加载到ImageView中即可。

另一方面,来自ImageView#setImageResource上的文档:

  

这可以在UI线程上进行Bitmap读取和解码   导致延迟打嗝。如果这是一个问题,请考虑使用   setImageDrawable(android.graphics.drawable.Drawable)或   改为使用setImageBitmap(android.graphics.Bitmap)和BitmapFactory。