调用Base adapter.getview()方法时,ListView变慢

时间:2011-09-14 18:19:44

标签: android performance android-layout baseadapter

我一直在调试我的应用程序,我看到当我滚动listview时,调用BaseAdapter类的方法getView()来生成新视图

public View getView(int position, View convertView, ViewGroup parent) {
    Article article = this.articles.get(position);
    return new MainView(this.context, articulo.getTitle() , articles.getDescription(),articles.getImgUrl());)  }

当我滚动listActivity以查看新项时,再次调用此方法以创建下面的列表视图项,因此列表项具有ListActivity变慢的图像,是否有任何方法可以创建所有项视图一次,当我们滚动listActivity时不创建ListItem

3 个答案:

答案 0 :(得分:2)

ListViews针对性能进行了高度优化,您应该使用ListAdapter中的ViewHolder来缓存ListItem。

检查http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html

规则是,首先设置你的自定义视图,将所有内容打包到你的持有者中并将此持有者固定到视图上,第二次使用视图时android简单地提取持有者信息(非常快)。

答案 1 :(得分:0)

答案 2 :(得分:0)

每次调用getView时都不应创建新视图。传入的convertView允许使用重用现有的View。在您的情况下,这将是MainView的一个实例。所以你可以这样做:

MainView mv;
if (convertView != null){
  mv = (MainView) convertView;
  ((TextView) mv.findViewById(R.id.title)).setText(articulo.getTitle());
  // similar for description and imgUrl
} else {
  mv = new MainView(...);
}
return mv;

此外,您可以使用Michele建议的ViewHolder模式。这将允许您在设置标题等时避免findViewById查找。Here is a great explanation of ViewHolder