2

我不明白什么是转换视图。具体来说,程序何时进入 if 条件以及何时进入 else 条件?

public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;
        LayoutInflater mInflater = (LayoutInflater) getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.data, parent, false);

            holder = new ViewHolder();
            holder.txtDesc = convertView.findViewById(R.id.txtDesc);
            holder.txtSubject = convertView.findViewById(R.id.txtSubject);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        holder.txtDesc.setText(profileListView.get(position).getName());
        holder.txtSubject.setText(profileListView.get(position).getEmail());

        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(context, profileListView.get(position).getName()+"hi go to detail page", Toast.LENGTH_SHORT).show();


            }
        });
        return convertView;
    }
4

1 回答 1

2

convertViewListView适配器重用的视图。当您滚动时,不再可见的项目将被重新用于显示变得可见的新项目。这称为回收,它是为了提高性能而完成的。

convertView为 null 时,表示没有可重复用于此项目的视图,因此您必须从 XML 布局中扩充一个新视图,并在方法结束时将其返回。

当它不为 null 时,表示该视图已被重用。您可以采用转换视图,用新数据替换旧数据,然后返回此视图。通过这种方式,您可以消除inflate昂贵操作的方法调用。这有助于您的列表视图平滑滚动。

这里还有另一个性能改进——视图持有者模式。它存储对项目视图的引用,因此您不必findViewById为每个项目调用操作。这也是一项昂贵的操作,最好避免。

于 2018-06-27T11:24:53.287 回答