在Android中回收列表行视图的两种技术之间的差异

时间:2015-02-07 06:45:28

标签: java android android-listview

我知道有关在列表中回收行的方法。我通常看到的是那种使用static类和标签(viewHolder

的技术

例如:

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    ViewHolder holder = null;

    if ( convertView == null )
    {
        convertView = mInflater.inflate(R.id.row, null);  
        holder = new ViewHolder();
        holder.txt1 = (TextView) convertView.findViewById( R.id.txt1 );
        holder.txt2 = (TextView) convertView.findViewById( R.id.txt2 );
        holder.txt3 = (TextView) convertView.findViewById( R.id.txt3 );
// setting more images,images
        convertView.setTag (holder);
    }
    else
    {
        holder = (ViewHolder) convertView.getTag ();
    }

    holder.txt1.setText( data.get( position ).txt1 );
    holder.txt2.setText( data.get( position ).txt2 );
    holder.txt3.setText( data.get( position ).txt3 );

    return convertView;
}

static class ViewHolder{
    TextView txt1;
    TextView txt2;
    TextView txt3;
}

但是在某些代码中,我看到了更简单的方法,它没有使用static类和标记,它只是检查视图是否被回收,如果它是使用它,如果它没有创建它。

 public View getView(int position, View convertView, ViewGroup parent) {
                if(convertView == null){
                    convertView = LayoutInflater.from(getActivity()).inflate(R.layout.history_row, null);
                }
        LinearLayout row = (LinearLayout) convertView.findViewById(R.id.row);

      TextView txt1 = (TextView) convertView.findViewById(R.id.txt1);
                    txt1.setText(data.getTxt1());
     TextView txt2 = (TextView) convertView.findViewById(R.id.txt1);
                    txt2.setText(data.getTxt2());
     TextView txt3 = (TextView) convertView.findViewById(R.id.txt2);
                    txt3.setText(data.getTxt3());

    }

它们之间有什么不同,哪种更好用?

1 个答案:

答案 0 :(得分:0)

findViewById()是一个昂贵的电话。人们应该避免使用它。在第一种方法中,为所有新创建的视图调用findViewById(),而不为任何convertView调用findViewById()。在第二种方法中,为所有视图调用{{1}}。毫无疑问,第一种方法更好用。