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

psy*_*tik 5 performance android listview

我有一个Android应用程序,它既有CursorAdapter基于ListViews(由sqlite支持),也有BaseAdapter基于自定义的ListViews,它是从服务器上下载的JSON构建的.

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

我将两个ListViews配置相同 - 都使用fastScrollEnabled,scrollingCachesmoothScrollbar设置为true.

我正在寻找关于如何试图弄清楚这里发生了什么以及可能修复它的线索,以便基于JSON的ListViews和基于Cursor的那样快.

Ale*_*lov 3

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

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

    private static class ViewHolder {

       ImageView image;
       TextView text;
    
    Run Code Online (Sandbox Code Playgroud)

    }

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

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

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