Listview适配器getView方法的2个代码有什么区别

时间:2016-06-20 13:16:50

标签: android listview

我知道回收视图是新的,但我想知道列表视图中2个代码的区别。我已经尝试过搜索很多但没有得到具体答案。我知道第一个比第二个更快,因为内存消耗,但为什么第二个代码比第一个慢,内部过程是什么,任何人都可以使用它。

这是第一个代码

 @Override
    public View getView(final int position, View convertView, ViewGroup parent) {


 final HashMap<String ,String > item = lst.get(position);
            ViewHolderItem viewHolder;
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.shadow_request_row, parent, false);

            viewHolder = new ViewHolderItem();
            viewHolder.title = (TextView)convertView.findViewById(R.id.item_name);
            viewHolder.msg = (TextView)convertView.findViewById(R.id.message);

            convertView.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolderItem) convertView.getTag();
        }
        viewHolder.title.setText(item.get(Const.USERNAME));
        viewHolder.msg.setText(item.get(Const.GET_MESSAGE));
        return convertView;
   }

这是第二个代码

 @Override
        public View getView(final int position, View convertView, ViewGroup parent) {

 final HashMap<String ,String > item = lst.get(position);
            ViewHolderItem viewHolder;
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.shadow_request_row, parent, false);

            viewHolder = new ViewHolderItem();
            viewHolder.title = (TextView)convertView.findViewById(R.id.item_name);
            viewHolder.msg = (TextView)convertView.findViewById(R.id.message);

        }
        viewHolder.title.setText(item.get(Const.USERNAME));
        viewHolder.msg.setText(item.get(Const.GET_MESSAGE));
        return convertView;
   }

2 个答案:

答案 0 :(得分:0)

如果视图刚刚膨胀,则第二个示例缺少关于将viewHolder保存为已创建视图的标记的部分,如果视图已存在则重复使用viewHolder

答案 1 :(得分:0)

列表视图项目可以随时重新创建。 (当您向上和向下滚动时会发生这种情况)。每当ListView需要重新创建一个项目时,它会调用具有所需位置的适配器的getView()。在getView()方法中,您可以生成该位置所需的项View

用于在XML中查找findViewById()的方法View是CPU广泛的。如果您的XML包含很长的子序列且getView()包含大量findViewById()次调用,您可能会看到相当滞后。

这是ViewHolder的便利之处。 ViewHolder是一个可以保存View项的类。您可以使用已创建的ViewHolder对象,而不是每次都调用findViewById()

要使用此功能,您必须保存与特定位置关联的ViewHolder对象。你是这样做的。

ViewHolder viewHolder;
if(convertView==null){
   //the view is created for the first time
   //you have to make the View HOlder object here
   viewHOlder=new ViewHOlder(convertView);
   //ViewHOlder constructor can find the required view elements and store it in variables
   //now you have to save this View Holder object for future reference
   //you save it as a tag
   convertView.setTag(viewHolder);
}

现在您已为特定项目位置定义了视图持有者。以下是如何重新使用它。 当ListView适配器无法重新使用它时,convertView的{​​{1}}不为空。因此,重复使用发生在上述getItem()的{​​{1}}语句中。

else

在第二个示例中,您创建了ViewHOlder,但您永远不会再使用它。所以它没有改善。