GridView 太慢了
GridView is so slow
我正在用 BaseAdapter 填充 GridView,但滚动时速度太慢。可能是什么问题?它填充了两个 imageViews
+ 一个 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;
}
可能会有不同的东西..
- 您的图像视图的大小在布局中是否固定?父级的大小是否取决于图像视图中加载的图像的大小?
如果是,这会减慢您的查看速度,因为每次加载新图像时都必须调整整个布局。
- 如果图像大于图像视图,您应该在后台线程中对图片进行采样。
您可以使用 RecyclerView with GridLayoutManager 它具有平滑的滚动和比 GridView 更好的响应。
我们没有关于您设置到 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
我正在用 BaseAdapter 填充 GridView,但滚动时速度太慢。可能是什么问题?它填充了两个 imageViews
+ 一个 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;
}
可能会有不同的东西..
- 您的图像视图的大小在布局中是否固定?父级的大小是否取决于图像视图中加载的图像的大小?
如果是,这会减慢您的查看速度,因为每次加载新图像时都必须调整整个布局。
- 如果图像大于图像视图,您应该在后台线程中对图片进行采样。
您可以使用 RecyclerView with GridLayoutManager 它具有平滑的滚动和比 GridView 更好的响应。
我们没有关于您设置到 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