Android ScrollView 在渲染 ImageView 时非常缓慢

3

我在布局中以编程方式添加多个ImageViews,除了ScrollView本身外,一切似乎都很好......它滚动得非常慢,并且在滚动时出现了很多卡顿。这可能是什么原因呢?

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <LinearLayout 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:id="@+id/jobs_container"
        >

    </LinearLayout>
</ScrollView>
编辑: 我遵循了这个教程成功地创建了我的列表视图,但是在滚动过程中列表视图仍然会出现延迟。我从 Web 服务获取 ImageView 的源,因此我的行项目基本上如下:
public class RowItem {
    private String imageSrc;
    private String title;

    public RowItem(String src, String title)
    {
        this.imageSrc = src;
        this.title = title;
    }
    public String getImageSrc()
            {
        return this.imageSrc;
    }
    public void setImageSrc(String src)
    {
        this.imageSrc = src;
    }
    public String getTitle()
    {
        return this.title;
    }
    public void setTitle(String title)
    {
        this.title = title;
    }
}

我基本上是获取JSON对象列表,将它们转换为RowItem,然后使用以下代码生成ListView的行:

public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    RowItem rowItem = getItem(position);

    LayoutInflater mInflater = (LayoutInflater) context
        .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_item, null);
        holder = new ViewHolder();
        holder.txtTitle = (TextView) convertView.findViewById(R.id.title);
        holder.imageView = (ImageView) convertView.findViewById(R.id.icon);
        convertView.setTag(holder);
    } else
        holder = (ViewHolder) convertView.getTag();
    holder.txtTitle.setText(rowItem.getTitle());
    String url = rowItem.getImageSrc();
    url = url.replace("~", DOMAIN);
    Picasso.with(context).load(url).into(holder.imageView);

    return convertView;
}

它仍然非常卡顿...有任何想法吗?

更新: 我认为imageviews造成了慢滚动的问题,因为在图片下载和加载之前一切都很顺畅,但在图片加载后开始变慢,并且在每次滚动时,将显示的隐藏行重新加载图像。这可能是原因吗?


如果“滚动延迟”,那就意味着你在代码的某个地方锁定了主 UI 线程,这与 ScrollView 本身无关。锁定主线程意味着在其上执行了过多的 CPU 密集型工作。这可能是由于你的图像列表非常长且没有使用 ListView 进行虚拟化,因此需要一些时间来渲染,或者可能是你的代码在主线程上执行的与此完全无关的操作。 - BladeCoder
1个回答

0

不要使用scrollView,而是要使用ListView,它具有滚动功能,并随着添加的项目自动扩展。

第一步,您必须定义一个如下所示的布局:

 <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
        <ListView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:id="@android:id/list"
            >

        </ListView>
    </LinearLayout>
  1. 使用getView()方法实现自定义ListView适配器

    View getView(int position, View convertView, ViewGroup parent) { View v = convertView;

       if(v == null)
    
          v = View.inflate(context , R.layout.your_item_layout_containing_image);
    
        ImageView imageView = (ImageView)v.findViewByID(R.id.your_image_view_id);
    
        Picasso.with(context).load(image_url).into(imageView);
        return v;
    

    }

Picasso是一个库,您可以直接下载和使用,以下载图像它具有非常好的特性。


谢谢Muhannad,我已经在使用Picasso了,它非常好用。我会尝试这个方法并回复结果。 - arash moeen
在我早期的安卓开发日子里,我曾经遇到过你在答案中提到的同样的问题,但是listView 是你将在安卓应用程序中使用的最佳视图,如果你需要任何关于如何使用ListView 的额外信息,请让我知道。 - Muhannad A.Alhariri
我已经编辑了我的问题,请您检查一下,看看能否找到问题?提前感谢。 - arash moeen
你可以尝试创建另一个对视图的引用,如下所示:View v = convertView; 并在方法的结尾返回v,而不是返回convertView吗? - Muhannad A.Alhariri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接