持有人模式和转换视图

时间:2015-04-18 12:26:38

标签: android performance android-fragments android-listview android-view

我之前已经了解了提高性能的好方法 - Holder Pattern。这是加速UI和动画的好主意 这显然是为什么以及如何使用它 我已经习惯了很多,但现在我对此有点困惑。
当调用getView方法时,它有三个参数,一个是converView。正如我所说,它是以前夸大的列表项目视图,所以这是一些问题。

  1. 如果它是以前膨胀的视图,为什么不只是使用它,从方法返回它,当然检查为null之前。
  2. 如何实现,listview类具有私有数组或另一个包含所有膨胀视图的数据结构?
  3. 为什么适配器中没有实现此功能?
  4. 提前致谢。

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

3 个答案:

答案 0 :(得分:1)

  1. 如果您只想使用convertView,则需要使用findViewById()获取您的观看次数。这正是ViewHolder模式试图避免的。 findViewById()是一种非常昂贵的方法,可能会降低您的应用速度,特别是如果您在滚动列表时经常调用它。
  2. Listviews会重复使用子项的布局,以避免不得不一遍又一遍地夸大相同的视图。
  3. 在人们提出ViewHolder模式之前,大多数适配器已经可供开发人员使用。最新的新列表视图RecyclerView具有一个强制使用ViewHolder模式的适配器。

答案 1 :(得分:0)

您无法在ViewHolder holder =(ViewHolder) convertView.getTag();的第一行拨打getView。因为convertView可能是null。再试一次:

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        ViewHoldler holder = null;
        if (convertView == null) {
            convertView = LayoutInflater.from(ctx).inflate(
                    R.layout.frag_home_gridview_item, null, false);
            holder = new ViewHoldler();
            holder.iv = (ImageView) convertView
                    .findViewById(R.id.gridview_item_label);
            holder.tv = (TextView) convertView
                    .findViewById(R.id.gridview_item_name);
            convertView.setTag(holder);
        } else {
            holder = (ViewHoldler) convertView.getTag();
        }
        holder.tv.setText(getItem(position));
        holder.iv.setImageResource(this.ids[position]);
        return convertView;
    }

    private class ViewHoldler {
        ImageView iv;
        TextView tv;
    }

答案 2 :(得分:0)

  1. 因为您很可能没有使用相同的观点。假设您有一行其中包含TextView。 convertview是循环视图之一,它的textview可能显示应该是的不同信息。
  2. 它确实保留了尽可能多的视图,一旦你向下滚动顶视图得到回收,你就回来回答1.
  3. 我不明白,您的代码来自BaseAdapter类。