zoukankan      html  css  js  c++  java
  • ListView优化

    在getView()方法中,每次都将布局重新加载了一遍,当ListView快速滚动的时候,这就会成为性能的瓶颈。

    getView()方法中还有一个convertView参数,这个参数用于将之前加载好的布局进行缓存,以便之后可以进行重用。

    因此我们可以通过他来进行优化:

     @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Fruit fruit = getItem(position);
            View view;
            if (convertView == null) {
                view = LayoutInflater.from(getContext()).inflate(resourceId, parent,
                    false);
            } else {
                view = convertView;
            }
            ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
            TextView fruitName = (TextView) view.findViewById(R.id.fruit_name);
            fruitImage.setImageResource(fruit.getImageId());
            fruitName.setText(fruit.getName());
            return view;
        }

    不过,目前我们的这份代码还是可以继续优化的,虽然现在已经不会再重复去加载布局,但是每次在getView()方法中还是会调用ViewfindViewById()方法来获取一次控件的实例。我们可以借助一个ViewHolder来对这部分性能进行优化:

     @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Fruit fruit = getItem(position);
            View view;
            ViewHolder viewHolder;
            if (convertView == null) {
                view = LayoutInflater.from(getContext()).inflate(resourceId, parent,
                false);
                viewHolder = new ViewHolder();
                viewHolder.fruitImage = (ImageView) view.findViewById
                (R.id.fruit_image);
                viewHolder.fruitName = (TextView) view.findViewById (R.id.fruit_name);
                view.setTag(viewHolder); // 将ViewHolder存储在View中
            } else {
                view = convertView;
                viewHolder = (ViewHolder) view.getTag(); // 重新获取ViewHolder
            }
            viewHolder.fruitImage.setImageResource(fruit.getImageId());
            viewHolder.fruitName.setText(fruit.getName());
            return view;
        }
    
        class ViewHolder {
    
            ImageView fruitImage;
    
            TextView fruitName;
    
        }
  • 相关阅读:
    C#实现将字符串转换成代码并执行
    Net实现钩子函数(Hook)以及通过SendMessage实现自动点击按钮和给文本框赋值
    异步与多线程的区别
    使用NODEJS实现JSONP的实例
    JS闭包作用域解析
    InterLocked学习笔记
    C#方法中的各类参数
    C# 数据类型详解以及变量、对象与内存
    通过Performance Monitor观察程序内存使用情况
    Git学习笔记(windows git之初体验)
  • 原文地址:https://www.cnblogs.com/lvcoding/p/8286768.html
Copyright © 2011-2022 走看看