android - getView() 的两种实现有什么区别?

标签 android listview

谁能解释一下这两种 getView() 实现之间的区别是什么?

第一个简单地检查 convertView 是否为 null;如果它为 null,则膨胀一个新的 View 对象。然后给子View设置合适的值。

@Override
public View getView(int position, View convertView, ViewGroup parent) 
{           
    if(convertView == null)
    {
        LayoutInflater inflater = context.getLayoutInflater();
        convertView = inflater.inflate(R.layout.itemlayout, null, true);
    }   

    ImageView image = (ImageView) convertView.findViewById(R.id.icon);
    TextView text = (TextView) convertView.findViewById(R.id.name);     

    MyItem item = items[position];
    text.setText(item.name);
    if("male".equals(item.gender))
    {
        image.setImageResource(R.drawable.male);
    }
    else if("female".equals(item.gender))
    {
        image.setImageResource(R.drawable.female);
    }

    return convertView;
}

第二个是所谓的“ViewHolder”模式。许多开发人员说这种方法节省了大量内存和 CPU 时间。但是第一个实现还检查了 convertView 的存在。第一种方法不节省一些内存吗?谁能更深入、更清楚地解释这两种实现之间的区别?非常感谢。

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

    View itemView = convertView;
    if(itemView == null)
    {
        LayoutInflater inflater = context.getLayoutInflater();
        itemView = inflater.inflate(R.layout.itemlayout, null, true);
        holder = new ViewHolder();
        holder.image = (ImageView) itemView.findViewById(R.id.icon);
        holder.text = (TextView) itemView.findViewById(R.id.name);
        itemView.setTag(holder);
    }
    else
    {
        holder = (ViewHolder) itemView.getTag();
    }

    MyItem item = items[position];
    holder.text.setText(item.name);
    if("male".equals(item.gender))
    {
        holder.image.setImageResource(R.drawable.male);
    }
    else if("female".equals(item.gender))
    {
        holder.image.setImageResource(R.drawable.female);
    }

    return itemView;
}

最佳答案

第二种模式创建 ViewHolder 的静态实例,并在第一次加载时将其附加到 View 项,然后在以后的调用中从该 View 标记中检索它

getView() 被调用得非常频繁,特别是当您滚动大列表元素时,实际上每次 ListView 项在滚动时可见时都会调用它。

这可以防止 findViewById() 被多次无用地调用,将 View 保持在静态引用上,这是节省一些资源的好模式(特别是当您需要在 ListView 项目中引用许多 View 时)。

关于android - getView() 的两种实现有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6060045/

相关文章:

android - 将 Android 应用程序转换为黑莓应用程序

Android - 文本到语音确定进程结束

Android - 抽屉导航 - ScrollView 无滚动

android - 单击特定 View 时如何获取项目在 ListView 中的位置?

javascript - 使用 Jquery 选择或取消选择 ListView 中的所有复选框

android - 使用自定义适配器刷新可见的 ListView

java - 我可以知道我的库何时从 Java 或 Kotlin 调用吗?

来自主题 ID 的 Android 主题名称

java - 我有一个代表时间(以毫秒为单位)的 Long 列表。如何创建一个 ListView,在显示长整型之前将它们格式化为 MM :SS. LLL?

android - 滚动时将新项目添加到列表时获取数组索引超出边界异常