大型列表浏览问题

时间:2014-03-28 08:41:22

标签: android listview

我有一个巨大的列表视图,有超过100,000个项目。我现在做了什么..

    PostPaid accountItem = (PostPaid)arr.get(position);
    ViewHolder holder;
    if (convertView == null) {
        LayoutInflater mInflater = (LayoutInflater)
                context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
                convertView = mInflater.inflate(R.layout.list_support_item20, null);
                holder = new ViewHolder();
                holder.text = (TextView) convertView.findViewById(R.id.accountType);
                convertView.setTag(holder);
            }
            else {
                holder = (ViewHolder) convertView.getTag();
            }
            holder.text.setText(accountItem.getTitle());

我最初做了什么

LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.list_support_item, null);
TextView accountType = (TextView) convertView.findViewById(R.id.accountType);
accountType.setText(accountItem.getTitle());

我想问一下两者之间的区别,哪个更好?我怎样才能进一步提高性能。我正在测试kitat nexus,并且在两种情况下都能很好地工作,但我正在试图找出姜饼问题

2 个答案:

答案 0 :(得分:2)

I want to ask about the differences between two, and which on preferable?

要使用大量数据来表示总是优先使用ViewHolder模式。正如您已经意识到的那样,如果您不使用此模式,则必须为属于您夸大的布局的每个视图调用findViewById。使用此模式,您只需查找一次。

答案 1 :(得分:1)

Android列表视图的性能提示

  1. 使用ViewHolder模式
  2. 了解listview回收的工作原理

    How ListView's recycling mechanism works

    引用文档

    在滚动ListView期间,您的代码可能经常调用 findViewById(),这会降低性能。即使适配器返回一个膨胀的视图以进行回收,您仍然需要查找元素并更新它们。重复使用 findViewById()的方法是使用"视图持有者"设计模式。

     public View getView(int position, View convertView, ViewGroup parent) { 
             ViewHolder holder; 
    
             if (convertView == null) { // if convertView is null
                 convertView = mInflater.inflate(R.layout.mylayout, 
                         parent, false);
                 holder = new ViewHolder(); 
                     // initialize views  
                convertView.setTag(holder);  // set tag on view
            } else { 
                holder = (ViewHolder) convertView.getTag();
                        // if not null get tag 
                        // no need to initialize
            } 
    
            //update views here  
            return convertView; 
    }
    

    因此,每次使用ViewHolder都可以避免初始化视图,从而提高性能。仅当view为null时才初始化(if(convertView == null){。帮助平滑滚动

    你错过了重要的部分convertView.setTag(holder)和holder =(ViewHolder) ConvertView.getTag()

    Android Doc of Smooth scrolling in lisview