在Android ListView中改善滚动流畅性

8

我有一个 Android ListView,在滚动时会出现小的(比如说1-5帧)卡顿,大约每秒钟发生一次。我知道许多安卓手机都存在这种动画不流畅的问题,然而,在我的手机上(摩托罗拉 A855 运行 Android 2.2),原生联系人列表滚动得非常流畅。联系人列表中的项视图比我的列表中的项视图更加复杂,它是:

<RelativeLayout>
    <TextView />
    <TextView />
</RelativeLayout>

我只想实现与原生联系人列表一样的流畅度。似乎这应该可以在不优化本地代码的情况下实现,但也许我对此有所错误。
我尝试了几件事情:我进一步简化了项目视图,尝试以编程方式而非XML实例化它。我还尝试改变我对项目点击事件的反应方式,如此链接所述:

http://groups.google.com/group/android-developers/browse_thread/thread/7dc261a6b382ea74?pli=1

这些事情似乎都对性能没有影响。

我是否可以在我的应用程序中做一些事情来提高性能?我希望将此应用程序部署到多个手机上,因此在我的情况下更改手机设置或root设备不是一个选项。这是我适配器类中的getView方法:

    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater flater = (LayoutInflater)context.getSystemService(ListActivity.LAYOUT_INFLATER_SERVICE);
        layout = flater.inflate(R.layout.song_view, parent, false);
        TextView first = (TextView)layout.findViewById(R.id.firstLine);
        TextView second = (TextView)layout.findViewById(R.id.secondLine);

        Thing t = array.get(position);
        first.setText(t.title);
        second.setText(t.name);
        return layout;
    }

提前感谢!


请提供关于您的适配器的一些信息。 - Selvin
你应该至少阅读官方的安卓指南。这被称为ViewHolder模式。 - Truong Nguyen
2个回答

6

没有看到你的代码,很难知道发生了什么。

不过,有一个地方可以检查你的ListAdapter中的getView()方法(假设你正在使用自定义适配器)。试着重复使用作为参数传递的View,而不是每次创建新的View。此外,在这个方法中不要做太重的事情(例如网络调用),实际上尽量使其精简以获得最佳性能。


2
尝试并重复使用作为参数传递的视图,而不是每次创建一个新视图。这正是问题所在。我希望这能帮助其他人认为convertView参数只是为了方便而存在的人。我已经将我的原始错误代码添加到问题中,以便其他人可以看到我的错误。Mark Allison,你是一位(奇怪的、可怕的)计算机之神。 - charleslparker
如果我正在使用SimpleCursorAdapter的第二个非弃用构造函数,那应该怎么办?我应该扩展它还是它可以直接完成? - theblang
它将自动重复使用视图。如果您覆盖getView()方法,则需要处理视图回收。 - Mark Allison

3

原始链接已过时,请尝试使用此链接:http://www.linuxtopia.org/online_books/android/devguide/guide/samples/ApiDemos/src/com/example/android/apis/view/List14.html - Brett

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