GridView is so slow



我正在用BaseAdapter填充GridView,但滚动时速度很慢。有什么问题吗?2个imageViews + 1个textView

提前谢谢你。

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    RowHolder rowHolder = null;
    View itemView = convertView;
    final ThemeModel curTheme = getItem(position);
    if (itemView == null) {
        rowHolder = new RowHolder();
        itemView = mInflater.inflate(R.layout.view_themes_grid_row, parent, false);
        rowHolder.imageView = (ImageView) itemView.findViewById(R.id.imageView);
        rowHolder.imageView2 = (ImageView) itemView.findViewById(R.id.imageView2);
        rowHolder.textView = (TextView) itemView.findViewById(R.id.textView);
        itemView.setTag(rowHolder);
    }  else {
        rowHolder = (RowHolder) itemView.getTag();
    }
    rowHolder.textView.setText(curTheme.getThemeName());
    //Log("curTheme name = " + curTheme.getThemeName() + " / mainBg = " + curTheme.mainBg);

    if(curTheme.hasBgImage()) {
     // grid view item background image
      rowHolder.imageView.setBackgroundResource(curTheme.getMainBgImageId(Themes.this)); 
        //Picasso.with(Themes.this).load(drawable).into(rowHolder.imageView);
    } else {
    // grid view item background color
                  rowHolder.imageView.setBackgroundColor(Color.parseColor(curTheme.mainBg));
        //Picasso.with(Themes.this).load(Color.parseColor(curTheme.mainBg)).into(rowHolder.imageView);
    }
    if(curTheme.isUsing()) { //tick icon
        rowHolder.imageView2.setVisibility(View.VISIBLE);
    }
    else {
        rowHolder.imageView2.setVisibility(View.INVISIBLE);
    }
    rowHolder.imageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if(!curTheme.isUsing()) //can cause error..
                chooseTheme(curTheme);
        }
    });
    return itemView;
}

我们没有足够的关于你设置为imageView的图像的信息,但问题可能是因为它们的大小。您可以在应用到视图之前缩放它们。

Drawable bgDrawable = null;
if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    bgDrawable = getResources().getDrawable(curTheme.getMainBgImageId(Themes.this), null);
} else {
    bgDrawable = getResources().getDrawable(curTheme.getMainBgImageId(Themes.this));
}
//Scale the images
Bitmap bitmap = ((BitmapDrawable) bgDrawable).getBitmap();
Drawable drawable = new BitmapDrawable(
               getResources(), Bitmap.createScaledBitmap(bitmap,
               bitmap.getWidth() / 4,
               bitmap.getHeight() / 4,
               true)
          );
rowHolder.imageView.setBackground(drawable);
//You can use picasso

你可以使用RecyclerView与GridLayoutManager,它有平滑滚动和更好的响应比GridView。

可能有不同的东西…

    你的imageviews的大小在布局中是固定的吗?父类的大小取决于imageview中加载的图像的大小吗?

如果是,这会减慢你的视图速度,因为每次加载新图像时,整个布局都必须调整。

  • 如果图片比imageview大,你应该在后台线程中对图片进行采样。
  • 最新更新