在android列表适配器中,如果convertView为null且不为null,该怎么办?有人能解释一下下面的getView方法吗

在android列表适配器中,如果convertView为null且不为null,该怎么办?有人能解释一下下面的getView方法吗,android,listview,android-listview,listviewitem,convertview,Android,Listview,Android Listview,Listviewitem,Convertview,if(converView==null)的全部功能是什么{ } 其他的 { } 如果我避免编写其他部分,以及它如何影响我的代码呢? 我只是想知道如果没有其他部分,它是否工作正常。有人能解释一下convertview的gettag和settag吗 public View getView(int position, View convertView, ViewGroup parent) { DeviceViewHolder holder = null;

if(converView==null)的全部功能是什么{ } 其他的 { } 如果我避免编写其他部分,以及它如何影响我的代码呢? 我只是想知道如果没有其他部分,它是否工作正常。有人能解释一下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;
    }

该实现使用convertViews和ViewHolder模式,工作原理如下

Android只创建可见的视图,而不是为列表中的每个项目增加一个新视图。一旦视图离开屏幕,它将被重新使用。通过这种方式,相对较慢的充气呼叫数量被最小化

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

需要else,因为否则viewHolder变量将为null,应用程序将崩溃

为清楚起见,我建议您写以下内容:

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

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

该实现使用ConvertView和ViewHolder模式,并按如下方式工作

Android只创建可见的视图,而不是为列表中的每个项目增加一个新视图。一旦视图离开屏幕,它将被重新使用。通过这种方式,相对较慢的充气呼叫数量被最小化

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

需要else,因为否则viewHolder变量将为null,应用程序将崩溃

为清楚起见,我建议您写以下内容:

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

Edit:另外,您可以将LayoutInflator的创建移动到if(convertView==null){}语句中。否则就不需要了。

是最好的答案。这是一个1小时的谷歌IO演示,但它不是一个浪费时间可能的复制是最好的答案。这是一个1小时的Google IO演示,但这不是浪费时间。在我的案例中,如果使用上述if else,可能会导致一个持有者连接到两个ConvertView,最终导致单击一行并同时触发两行上的事件…………请提出一个新问题,考虑到你的两行评论对这里的任何人都没有帮助,我们也帮不了你。在我的情况下,使用上述if-else会导致一个holder附加到两个convertView,最终导致单击一行并同时触发两行上的事件…………请提出一个新问题,考虑到你的两行评论对这里的任何人都没有帮助,我们也帮不了你。