ListView 学习 缓存 3

来源:互联网 发布:centos查看端口 编辑:程序博客网 时间:2024/04/29 07:16

在ListView 开发中,如果数据量小,那缓存的效果不是很好,也就显示不出来这种效果,但是当数据量变得很大的时候,滑动ListView菜单变得很困难的时候,这样用户体验就变得很差,这个时候就需要使用ListView的缓存来处理这样的问题,在一般情况下,使用LayoutInflater进行加载文件
LayoutInflate 类似于finViewById这个方法,但是两个有完全的区别,LayoutFlate这个方法是将layout下的mxl布局文件进行加载,并且实例化,而后者,实在加载完毕后可以根据xml文件中的不同的id进行查找相应的标签并且得到相应的对象,所以在ListView的adapter中的getView方法可以缓存的调用;

LayoutInflater inflater =  (LayoutInflater)context.getSystemService                              (Context.LAYOUT_INFLATER_SERVICE);

因为context是activity的父类,所以可以构建自定义的adapter时候,需要传入相应的activity,在构造方法中就可以传入,然后可以根据上面的方法获得LayoutFater的对象
这里打个小的叉,得到LayoutFater对象可以有3中方式;
1. LayoutInflater inflater = getLayoutInflater();//调用Activity的getLayoutInflater() 2. LayoutInflater inflater = LayoutInflater.from(context);  3. LayoutInflater inflater =  (LayoutInflater)context.getSystemService                              (Context.LAYOUT_INFLATER_SERVICE);

在第三种方式获得systemService的,在参数可以进行变化获得吸纳供应的对象,参数如下:
传入的Name 返回的对象说明WINDOW_SERVICEWindowManager管理打开的窗口程序LAYOUT_INFLATER_SERVICELayoutInflater取得xml里定义的viewACTIVITY_SERVICEActivityManager管理应用程序的系统状态POWER_SERVICEPowerManger电源的服务ALARM_SERVICEAlarmManager闹钟的服务NOTIFICATION_SERVICENotificationManager状态栏的服务KEYGUARD_SERVICEKeyguardManager键盘锁的服务LOCATION_SERVICELocationManager位置的服务,如GPSSEARCH_SERVICESearchManager搜索的服务VEBRATOR_SERVICEVebrator手机震动的服务CONNECTIVITY_SERVICEConnectivity网络连接的服务WIFI_SERVICEWifiManagerWi-Fi服务TELEPHONY_SERVICETeleponyManager电话服务inflate 方法

这样可以在程序中有context的对象时进行获取吸纳供应的服务。回到主题:
在ListView中可以这样获取到布局文件:


public View getView(int position, View convertView, ViewGroup parent) {                         ViewHolder holder = null; //ViewHolder将相当于一个暂时的存储器,将产生的View存储起来            if (convertView == null) {                                 holder=new ViewHolder();                                   convertView = mInflater.inflate(R.layout.vlist2, null);                holder.img = (ImageView)convertView.findViewById(R.id.img);                                convertView.setTag(holder);                             }else {                                 holder = (ViewHolder)convertView.getTag();            }                                      holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));                                     holder.viewBtn.setOnClickListener(new View.OnClickListener() {                                 @Override                public void onClick(View v) {                    showInfo();                                 }            });                                      return convertView;        }

这种方式是最快的,在google大会上也是这种最快

当处理一些耗时的资源加载的时候需要做到以下几点,以使你的加载更快更平滑:

1.   适配器在界面主线程中进行修改

2.   可以在任何地方获取数据但应该在另外一个地方请求数据

3.   在主界面的线程中提交适配器的变化并调用notifyDataSetChanged()方法


0 0
原创粉丝点击