Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/188.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 保持架模式和转换视图_Android_Performance_Android Fragments_Android Listview_Android View - Fatal编程技术网

Android 保持架模式和转换视图

Android 保持架模式和转换视图,android,performance,android-fragments,android-listview,android-view,Android,Performance,Android Fragments,Android Listview,Android View,我在前面学到了提高性能的好方法-保持器模式。这是加速UI和动画的好主意。 它清楚地说明了使用它的原因和方法。 我经常使用它,但现在对此我有点困惑。 当调用getView方法时,它有三个参数,一个是converView。正如我所理解的,它是列表项之前膨胀的视图,所以这里有一些关于这个的问题 若它是以前膨胀的视图,为什么不直接使用它,从方法返回它,当然在之前检查为null listview类是如何实现的,它具有私有数组或另一个保存所有膨胀视图的数据结构 为什么适配器中没有实现此功能 提前谢谢 @Ov

我在前面学到了提高性能的好方法-保持器模式。这是加速UI和动画的好主意。
它清楚地说明了使用它的原因和方法。
我经常使用它,但现在对此我有点困惑。
当调用getView方法时,它有三个参数,一个是converView。正如我所理解的,它是列表项之前膨胀的视图,所以这里有一些关于这个的问题

  • 若它是以前膨胀的视图,为什么不直接使用它,从方法返回它,当然在之前检查为null
  • listview类是如何实现的,它具有私有数组或另一个保存所有膨胀视图的数据结构
  • 为什么适配器中没有实现此功能
  • 提前谢谢

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

    不能调用
    ViewHolder=(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;
        }
    
  • 因为您很可能没有使用相同的视图。假设您有一行,其中包含文本视图。convertview是回收视图之一,它的textview可能会显示不同的信息
  • 它保留了尽可能多的视图,一旦你向下滚动俯视图,它就会被回收,然后你回到答案1
  • 我不明白,你的代码来自BaseAdapter类
  • 如果只使用
    convertView
    ,则需要使用
    findViewById()
    获取视图。这正是ViewHolder模式试图避免的
    findViewById()
    是一种非常昂贵的方法,它会降低应用程序的速度,特别是当你在列表中滚动时不断调用它时
  • ListView重用子项的布局,以避免反复膨胀相同的视图
  • 在人们提出ViewHolder模式之前,开发人员已经可以使用大多数适配器。最新的新列表视图,
    RecyclerView
    ,有一个适配器,强制使用ViewHolder模式