我有以下性能问题。我正在开发一个 android 平板电脑应用程序,并且有一个像画廊一样的 gridview。每个项目有大约 3 个文本视图(短文本)和 2 个图像视图(1 个用于背景,1 个用于重要项目的小图标)。目标设备分辨率相当大(1920x800),因此网格矩阵显示为 6 x 5 项。
我已经实现了,但是滚动体验很糟糕。当我随时缓慢滚动时,应该出现新的 6 个项目行时会出现短暂的冻结。然后该行将出现并且滚动正常,直到到达出现行的末尾并且应该再次出现新行。滚动回之前可见的行时的行为相同。任何人都可以给我任何可以帮助平滑滚动的优化提示。
在我的适配器中,我在 getView 方法中使用优化功能作为持有者类和 getTag()。图片不是从 web 加载的,而是通过 setImageURI 方法从 sd 卡加载的。
无论如何,我期待这里的问题。以这种方式加载一行 - 6 个背景图像必须花费一些时间,但我不知道如何解决。bg 图像的平均大小为 50 KB。这是我的getView。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(mItemResId, parent, false);
holder = new ViewHolder();
holder.tvName = (TextView) convertView.findViewById(R.id.grid_item_name);
holder.tvPref = (TextView) convertView.findViewById(R.id.grid_item_pref);
holder.tvCustomText = (TextView) convertView.findViewById(R.id.grid_item_custom);
holder.ivBg = (ImageView) convertView.findViewById(R.id.grid_item_bg);
holder.ivSmallIcon = (ImageView) convertView.findViewById(R.id.grid_item_icon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
Product item = getItem(position);
holder.tvName.setText(item.getName());
holder.tvPref.setText(item.getPreference());
holder.tvCustomText.setText(item.getCustomText());
if (item.isImportant()) {
holder.ivSmallIcon.setVisibility(View.VISIBLE);
} else holder.ivSmallIcon.setVisibility(View.GONE);
File f = new File( item.getImagePath() );
if ( f.exists() ) {
holder.ivBg.setImageURI( Uri.fromFile(f) );
} else {
holder.ivBg.setImageResource(R.drawable.no_img);
}
return convertView;
}
或者有没有机会在调用 getView 方法之前预取不可见的项目或至少图像?或者还有什么可以帮助的?
非常感谢。