ListView详解

1.如何提高ListView的效率
①:复用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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值