代码之家  ›  专栏  ›  技术社区  ›  psychotik

滚动基于光标的适配器的大列表比内存中适配器的小列表要快得多。

  •  5
  • psychotik  · 技术社区  · 14 年前

    我有一个Android应用程序,两者都有 CursorAdapter 基于 ListView S(由sqlite支持)以及自定义 BaseAdapter 基于 列表视图 从从服务器下拉的JSON中动态构建的。

    两者显示的数据是相同的-一个图像和两个 TextView 我的基于光标的listview有3000行,基于json的listview大约有30行。但是,对于基于光标的适配器,向下滚动列表要快得多。对于基于JSON的列表,数据都是在行可见之前获取的。这两种列表的图像都是按需下载的。

    我有两个相同配置的列表视图-都有 fastScrollEnabled , scrollingCache smoothScrollbar 设置为真。

    我正在寻找有关如何尝试弄清楚这里发生了什么并可能修复它的线索,以便基于JSON 列表视图 和基于光标的一样快。

    1 回复  |  直到 14 年前
        1
  •  3
  •   Alex Orlov    14 年前

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

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

      private static class ViewHolder {

         ImageView image;
         TextView text;
      

      }

    第一次(当convertview为空并且需要创建一个新行时),您只需创建视图持有者的实例,并将这些参数设置为引用新创建行中的参数(通过调用findViewByID),然后将此实例放入行的settag方法中。 下次,当您重用convertview时,只需调用get tag,在收到的标记中,您将获得对该行中视图的引用,因此您不再需要调用findViewByID。

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

    另外,我建议你(如果你还没有)观看关于listview的谷歌I/O演示。这里有很多有用的信息: http://www.youtube.com/watch?v=wDBM6wVEO70