1

if(converView==null) { } else { } 如果我避免编写 else 部分以及它如何影响我的代码怎么办?我只是想知道如果没有其他部分它是否可以正常工作。有人可以解释一下convertview的gettag和settag吗???

            public View getView(int position, View convertView, ViewGroup parent) {
        DeviceViewHolder holder = null;
        mSelectedDeviceBin = getItem(position);

        LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.single_device_view, null);
            holder = new DeviceViewHolder();
            holder.deviceId = (TextView) convertView
                    .findViewById(R.id.deviceId);

            holder.deviceType = (TextView) convertView
                    .findViewById(R.id.deviceType);

            convertView.setTag(holder);

        } else

            holder = (DeviceViewHolder) convertView.getTag();

        // Populating the views
        holder.deviceId.setText(mSelectedDeviceBin.getDeviceBinId());

        StringBuilder deviceCount = new StringBuilder();
        deviceCount.append("");
        double count = mSelectedDeviceBin.getQtyStock();
        deviceCount.append(count);
        String deviceCountString = deviceCount.toString();
        holder.deviceType.setText("Total number of Items:"
                + deviceCountString);

        return convertView;
    }
4

1 回答 1

6

该实现使用 convertViews 和 ViewHolder 模式,工作方式如下。

Android 不会为列表中的每个项目添加一个新视图,而是只创建可见的视图。一旦视图离开屏幕,它将被重用。这样,相对较慢的膨胀调用的数量被最小化。

其次,ViewHolder 模式确保视图查找的数量(findViewById())被最小化,因为这也相对较慢,尤其是在滚动时。因此,不是每次都查找视图,而是将直接引用保存在内存中,并存储在 ViewHolder 中。为了确保正确的 ViewHolder 对象与正确的项目视图一起存储,它们在 convertView 中使用 view.setTag() 进行设置。它们可以通过使用 getTag() 调用来获得。

else 是必需的,否则 viewHolder 变量将为空,应用程序将崩溃。

为了清楚起见,我建议你这样写 else:

} else {
    holder = (DeviceViewHolder) convertView.getTag();
}

编辑:另外,您可以在 if(convertView == null){} 语句中移动 LayoutInflator 的创建。否则不需要。

于 2013-10-23T13:58:18.887 回答