提高 Android ListView 中的滚动平滑度
Posted
技术标签:
【中文标题】提高 Android ListView 中的滚动平滑度【英文标题】:Improving Scroll Smoothness in an Android ListView 【发布时间】:2011-09-11 17:37:30 【问题描述】:我有一个 android ListView
,它在滚动时会有很小的(比如 1-5 帧)卡顿,大约每秒左右。我意识到许多Android手机在动画流畅度方面存在这些问题,但是,在我的手机(运行Android 2.2的摩托罗拉A855)上,原生联系人列表滚动非常流畅。联系人列表中的项目视图比我列表中的项目视图更复杂,即:
<RelativeLayout>
<TextView />
<TextView />
</RelativeLayout>
我只想实现与原生联系人列表一样好的流畅度。看起来这应该可以在不优化本机代码的情况下实现,但也许我错了。
我尝试了一些方法:我进一步简化了项目视图,并尝试以编程方式而不是在 XML 中实例化它。根据此链接,我还尝试更改对项目单击事件的反应方式:
http://groups.google.com/group/android-developers/browse_thread/thread/7dc261a6b382ea74?pli=1
这些东西似乎都不会对性能产生任何影响。
我可以在我的应用中做些什么来提高性能吗?我希望将此应用程序部署到许多手机上,因此在我的情况下,更改手机上的设置或生根设备不是一个选项。这是我的适配器类中的 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;
提前致谢!
【问题讨论】:
提供有关您的适配器的一些信息 您应该*至少阅读官方的 android 指南。它被称为 Viewholder 模式。 【参考方案1】:如果没有看到您的代码,很难知道为什么会发生这种情况。
但是,要查看的一个地方是 ListAdapter 中的 getView() 方法(假设您使用的是自定义适配器)。尝试重新使用作为参数传递给此方法的视图,而不是每次都创建一个新视图。也不要在此方法中做任何过于繁重的事情(例如网络调用),实际上尽量使其精简和平均以获得最佳性能。
【讨论】:
“尝试重新使用作为参数传递给此方法的视图,而不是每次都创建一个新视图”。事实证明,这正是问题所在。我希望这可以帮助其他认为 convertView 参数只是为了方便的人。我已将我原来的、损坏的代码添加到问题中,以便人们可以看到我的错误。 Mark Allison,你是一个(奇怪、可怕的)计算之神。 如果我将SimpleCursorAdapter
与第二个未弃用的构造函数一起使用会怎样?我应该扩展它还是应该开箱即用?
它将使用自动回收视图。如果你覆盖 getView() 你需要处理视图回收。【参考方案2】:
您是否尝试过高效适配器 http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html
在我看来,动画流畅度的问题是由于后台运行的垃圾收集器造成的。如果您正在创建大量对象,那么您将在列表视图滚动中看到滞后。
希望对您有所帮助。
【讨论】:
原链接已弃用,试试这个:linuxtopia.org/online_books/android/devguide/guide/samples/…以上是关于提高 Android ListView 中的滚动平滑度的主要内容,如果未能解决你的问题,请参考以下文章
Viewpager Fragment中的Android Listview-不滚动
ScrollView 中的 ListView 在 Android 上不滚动