我有一个包含viewpager和导航抽屉的android项目。在viewpager的每个片段中,我都有一个gridview,其中包含来自服务器的加载数据!我的问题是,从低硬件到强大硬件的所有设备一切正常,但在某些设备中,例如galaxy s4和一些sony xperia,它在滚动gridview或打开导航抽屉时会产生太多延迟。怎么了?
P.S:下面是gridview适配器的代码:
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = inflater.inflate(R.layout.grid_item, parent, false);
}
SimpleData item = myDatas.get(position);
((TextView) convertView.findViewById(R.id.title)).setText(item.getName());
ImageView thumbnail = (ImageView) convertView.findViewById(R.id.thumbnail);
thumbnail.getLayoutParams().height = thumbnail.getLayoutParams().width;
if (item.getThumbnail() != null && !item.getThumbnail().isEmpty()) {
if (item.getThumbnail().startsWith("http")) {
Picasso.with(mContext)
.load(item.getThumbnail())
.placeholder(R.drawable.loading)
.into(thumbnail);
} else {
Picasso.with(mContext)
.load(Uri.fromFile(new File(item.getThumbnail())))
.placeholder(R.drawable.loading)
.into(thumbnail);
}
} else {
thumbnail.setImageResource(R.drawable.noimage);
}
((TextView) convertView.findViewById(R.id.province)).setText(item.getProvince());
((TextView) convertView.findViewById(R.id.likesCount)).setText(item.getLikesCount() + "");
convertView.forceLayout();
return convertView;
}
答案 0 :(得分:1)
最后我发现了问题!滞后是因为代码的else部分在UI线程上设置了图像,在Line:
下面 thumbnail.setImageResource(R.drawable.noimage);
所以我用压缩文件替换了“noimage”drawable并更改了这一行以使用Picasso加载文件,如下所示,一切都很好。
Picasso.with(mContext)
.load(R.drawable.noimage)
.placeholder(R.drawable.loading)
.into(thumbnail);
感谢大家的帮助。
答案 1 :(得分:0)
你做了很多不推荐的事情,这可能是造成你的滞后的原因。
首先不要使用convertView.forceLayout();
,根据其documentation,它会强制您的布局在不需要时进行渲染。其次,你膨胀convertView
,你应该不在适配器的getView
中这样做。请记住,你正在覆盖一个类,并且不是你的工作是膨胀布局,它是由上层的适配器类自动完成的。
最后,您不会以下列形式使用适配器设计模式:
if (convertView == null) {
...
} else {
...
}
有关后者的更多信息,请参阅this documentation,有一个ImageAdapter
示例。
答案 2 :(得分:0)
你的getView方法做了很多事情,你应该学习如何在GridView中加载位图asynchronously,之后它就不会落后了。