android UI在某些设备上滞后

时间:2016-05-11 09:30:49

标签: android android-fragments android-gridview android-navigation-drawer

我有一个包含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;
}

3 个答案:

答案 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,之后它就不会落后了。