滚动大型基于Cursor的适配器列表比内存适配器的更小的列表更快

时间:2010-11-03 07:33:58

标签: android listview performance

我有一个基于CursorAdapter的{​​{1}} s(由sqlite支持)以及基于ListView的{​​{1}}基于BaseAdapter的Android应用程序来自JSON从服务器上下来。

两者中显示的数据完全相同 - 图像和几个ListView s。我的基于Cursor的ListView有3000行,基于JSON的ListView大约有30行。但是,对于基于Cursor的适配器,向下滚动列表要快得多。对于基于JSON的列表,数据全部在行可见之前获取。两种类型的列表的图像都是按需下载的。

我同时配置了两个ListViews - TextViewfastScrollEnabledscrollingCache都设置为true。

我正在寻找有关如何尝试弄清楚这里发生了什么以及可能修复它的线索,以便基于JSON的smoothScrollbar和基于游标的一样快。 / p>

1 个答案:

答案 0 :(得分:3)

我的应用程序中有类似的东西,除了我只有json支持的ListView,我还有大约30个项目(数据不断变化,动画播放以反映变化)。 使用您提供的一些代码可以更容易地检测到问题,但是您可以采取一些技巧来进行优化。

  1. 重用作为getView方法中的参数之一传递给你的convertView,它确实加快了滚动速度。
  2. 创建自己的行视图(通过扩展某些布局或ViewGroup),或者在从getView方法返回的行上使用setTag。在此标记中,您应该保留一个对象,该对象包含对该行中视图的引用,因此每次请求行时您都不会使用findViewById搜索它们。 Object可以是一个简单的静态类,如

    private static class ViewHolder {

       ImageView image;
       TextView text;
    

    ImageView image; TextView text;

  3. 第一次(当convertView为null并且您需要创建一个新行时),您只需创建ViewHolder的实例并设置这些参数以引用新创建的行中的参数(通过调用findViewById),然后放入这个实例在row的setTag方法中。 下次重用convertView时,只需调用getTag,在收到的标签中,您将获得对该行中视图的引用,因此您将不再需要调用findViewById。

    当然,你可能已经完成了所有这些事情。

    P.S。我建议您(如果您还没有)观看有关ListView的Google I / O演示文稿。那里有很多有用的信息:http://www.youtube.com/watch?v=wDBM6wVEO70