ListView详解
2016-12-10 23:49
260 查看
1.如何提高ListView的效率
①:复用converterView,使用已经建好的对象。
②:使用ViewHolde,减少findViewById()的次数
③:对数据列表进行分页加载显示
1)通过Scroll监听ListView.setOnScrollListener,当到达底部时加载下一页列表数据并显示。
2)使用第三方,比如Android-PullToRefresh等
④:图片缓存处理(三级缓存)
三级缓存分为:内存缓存,本地缓存,网络缓存
1.内存缓存,优先加载,速度最快
根据url从一级缓存(Map
2.本地缓存:次优先加载,速度快,使用DiskLruCache技术;写入缓存,通过DiskLruCache.Editor实例的newOurputStream方法创建一个输出流,将缓存文件写入;读取缓存:DisLruCache的get();移除缓存:remove();
3.网络缓存:将从网络缓存获取到的图片保存到内存缓存和本地缓存中;如果获取Bitmap失败显示错误或者默认图片
2.ListView如何实现分页加载
①:设置ListView的滚动监听器:setOnScrollListener(new OnScrollListener(){….})
其中有两个方法:滚动状态发生变化的方法(onScrollStateChanged)和ListView被滚动时调用的方法(onScroll)
②:滚动有三种状态
SCROLL_STATE_TOUCH_SCROLL: // 触摸滑动
惯性滚动(滑翔(flgin状态:SCROLL_STATE_FLING: //滑翔
静止状态:对不同的状态进行处理:SCROLL_STATE_IDLE: //静止
分页加载只关心静止状态,最后一个可见条目,如果滚动数量大于总的数量的时候,可以提示用户无更多数据了。
3.分类型的ListView
ListView显示的每个条目都是通过baseAdapter的getView(int position,View convertView,ViewGroup parent)来展示的,理论上我们完全可以让每个条目都是不同类型view。此时需要重写getViewTypeCount和getItemViewType两个方法。
通过ListVeiw.setSelection(listView,getPostion())方法定位到指定位置。
4.刷新单个ListView中的单个Item数据
1)得到第一个可见显示控件的位置
2)只当要更新的view在可以位置的时候才更新,不可见时就不管他了
3)得到要更新item的view,从view中取得holder
4)得到对应的数据
比如:
①:复用converterView,使用已经建好的对象。
②:使用ViewHolde,减少findViewById()的次数
③:对数据列表进行分页加载显示
1)通过Scroll监听ListView.setOnScrollListener,当到达底部时加载下一页列表数据并显示。
2)使用第三方,比如Android-PullToRefresh等
④:图片缓存处理(三级缓存)
三级缓存分为:内存缓存,本地缓存,网络缓存
1.内存缓存,优先加载,速度最快
根据url从一级缓存(Map
//终极压缩方式 public static int getRatioSize(int bitWidth, int bitHeight) { // 图片最大分辨率 int imageHeight = 1280; int imageWidth = 960; // 缩放比 int ratio = 1; // 缩放比,由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可 if (bitWidth > bitHeight && bitWidth > imageWidth) { // 如果图片宽度比高度大,以宽度为基准 ratio = bitWidth / imageWidth; } else if (bitWidth < bitHeight && bitHeight > imageHeight) { // 如果图片高度比宽度大,以高度为基准 ratio = bitHeight / imageHeight; } // 最小比率为1 if (ratio <= 0) ratio = 1; return ratio; } public static void compressBitmap(Bitmap image, String filePath) { // 最大图片大小 100KB int maxSize = 100; // 获取尺寸压缩倍数 int ratio = NativeUtil.getRatioSize(image.getWidth(), image.getHeight()); // 压缩Bitmap到对应尺寸 Bitmap result = Bitmap.createBitmap(image.getWidth() / ratio, image.getHeight() / ratio, Config.ARGB_8888); Canvas canvas = new Canvas(result); Rect rect = new Rect(0, 0, image.getWidth() / ratio, image.getHeight() / ratio); canvas.drawBitmap(image, null, rect, null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 int options = 100; result.compress(Bitmap.CompressFormat.JPEG, options, baos); // 循环判断如果压缩后图片是否大于100kb,大于继续压缩 while (baos.toByteArray().length / 1024 > maxSize) { // 重置baos即清空baos baos.reset(); // 每次都减少10 options -= 10; // 这里压缩options%,把压缩后的数据存放到baos中 result.compress(Bitmap.CompressFormat.JPEG, options, baos); } // JNI调用保存图片到SD卡 这个关键 NativeUtil.saveBitmap(result, options, filePath, true); // 释放Bitmap if (result != null && !result.isRecycled()) { result.recycle(); result = null; } }
2.本地缓存:次优先加载,速度快,使用DiskLruCache技术;写入缓存,通过DiskLruCache.Editor实例的newOurputStream方法创建一个输出流,将缓存文件写入;读取缓存:DisLruCache的get();移除缓存:remove();
3.网络缓存:将从网络缓存获取到的图片保存到内存缓存和本地缓存中;如果获取Bitmap失败显示错误或者默认图片
2.ListView如何实现分页加载
①:设置ListView的滚动监听器:setOnScrollListener(new OnScrollListener(){….})
其中有两个方法:滚动状态发生变化的方法(onScrollStateChanged)和ListView被滚动时调用的方法(onScroll)
②:滚动有三种状态
SCROLL_STATE_TOUCH_SCROLL: // 触摸滑动
惯性滚动(滑翔(flgin状态:SCROLL_STATE_FLING: //滑翔
静止状态:对不同的状态进行处理:SCROLL_STATE_IDLE: //静止
分页加载只关心静止状态,最后一个可见条目,如果滚动数量大于总的数量的时候,可以提示用户无更多数据了。
3.分类型的ListView
ListView显示的每个条目都是通过baseAdapter的getView(int position,View convertView,ViewGroup parent)来展示的,理论上我们完全可以让每个条目都是不同类型view。此时需要重写getViewTypeCount和getItemViewType两个方法。
通过ListVeiw.setSelection(listView,getPostion())方法定位到指定位置。
4.刷新单个ListView中的单个Item数据
1)得到第一个可见显示控件的位置
2)只当要更新的view在可以位置的时候才更新,不可见时就不管他了
3)得到要更新item的view,从view中取得holder
4)得到对应的数据
比如:
public void updateView(int itemIndex) { //得到第一个可显示控件的位置, int visiblePosition = mListView.getFirstVisiblePosition(); //只当要更新的view在可见的位置时才更新,不可见时,跳过不更新 if (itemIndex - visiblePosition >= 0) { //得到要更新的item的view View view = mListView.getChildAt(itemIndex - visiblePosition); //从view中取得holder ViewHolder holder = (ViewHolder) view.getTag(); //得到对应的数据 HashMap<String, Object> item = list.get(itemIndex); holder.listItem = (RelativeLayout) view.findViewById(R.id.rl_item); holder.ibPlay = (ImageButton) view.findViewById(R.id.ib_play); holder.ibDelete = (ImageButton) view.findViewById(R.id.ib_delete); updateData(itemIndex, holder, item); } }
相关文章推荐
- eclipse中使用maven创建Java web项目的详细步骤
- freeline集成到Android Studio
- Oracle升级前备份和失败回退
- robotframework中的pybot和robot的区别
- C++编程基础(1)
- Python语言编程(一)
- C/C++编译器、编辑器、IDE
- 视频会议及流媒体十大开源项目
- Android开发 百度地图开发(定位、传感器应用)
- 笔记:oracle关于使用代理主键还是逻辑主键的好?
- 历届试题 核桃的数量
- 那些年陪伴我的老师+我期待的师生关系
- FastDFS使用经验分享
- 转载两篇关于WSGI的文章
- 为什么循环里的gets()和fgets()在前面有一个scanf时,会跳过第一个的输出
- Java被忽略的基本知识(三)
- win8.1安装Matlab7.0的兼容问题
- 关于一个变态的异常
- Linux软件安装与管理之yum安装方式
- hdu 1695 GCD 欧拉函数 + 容斥