如何优化ListView

一、重用convertView,减少内存消耗

        // 这个方法要被执行很多次, 有多个条目 就要执行多少次
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view;
            ViewHolder holder;
            if (convertView == null) {
                view = View.inflate(CallSmsSafeActivity.this,
                        R.layout.item_callsms, null);
            ...
            } else {
                view = convertView; // 使用历史缓存view对象, 减少view对象被创建的次数
                ...
            }

二、使用ViewHolder标记View中的控件,减少搜索对性能的消耗。

根据界面需要定义ViewHolder

   class ViewHolder {
        TextView tv_phone;
        TextView tv_mode;
        ImageView iv_delete;
    }

在getView中使用ViewHolder

           if (convertView == null) {
                view = View.inflate(CallSmsSafeActivity.this,
                        R.layout.item_callsms, null);
                holder = new ViewHolder(); // 减少子孩子查询的次数
                holder.tv_phone = (TextView) view
                        .findViewById(R.id.tv_item_phone);
                holder.tv_mode = (TextView) view
                        .findViewById(R.id.tv_item_mode);
                holder.iv_delete = (ImageView) view
                        .findViewById(R.id.iv_delete);
                // 把孩子id的引用 存放在holder里面,设置给父亲 view
                view.setTag(holder);
            } else {
                view = convertView; // 使用历史缓存view对象, 减少view对象被创建的次数
                holder = (ViewHolder) view.getTag();
            }
            holder.tv_phone.setText("123456");
            ...

三、分段加载数据。例如,用户浏览到列表底部再动态加载新的数据。

在滑动静止时加载更多数据

        lv_callsms_safe = (ListView) findViewById(R.id.lv_callsms_safe);
        lv_callsms_safe.setOnScrollListener(new OnScrollListener() {
            // 滚动状态发生变化调用的方法。
            // OnScrollListener.SCROLL_STATE_FLING 惯性滑动
            // OnScrollListener.SCROLL_STATE_TOUCH_SCROLL 触摸滑动
            // OnScrollListener.SCROLL_STATE_IDLE 静止
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                switch (scrollState) {
                case OnScrollListener.SCROLL_STATE_IDLE: // 静止状态
                    // 判断是否是最后一个条目。
                    int lastPosition = lv_callsms_safe.getLastVisiblePosition();
                    System.out.println("最后一个可见条目的位置:" + lastPosition);
                    if (lastPosition == infos.size() - 1) { // //20条数据
                        // 加载更多的数据。 更改加载数据的开始位置
                        startIndex += maxCount;
                        if (startIndex >= totalCount) {
                            Toast.makeText(getApplicationContext(),
                                    "没有更多的数据了。", 0).show();
                            return;
                        }
                        fillData();
                    }
                    break;
                }
            }

            // 只要listview发生滚动 就会调用下面的方法
            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {

            }
        });

在DAO中使用limit和offset分段搜索sqlite

        SQLiteDatabase db = helper.getReadableDatabase();
        Cursor cursor = db.rawQuery("select number,mode from blackinfo order by _id desc limit ? offset ?", 
        new String[]{String.valueOf(maxCount),
                String.valueOf(startIndex)
        });
        List<BlackNumberInfo> blackNumberInfos = new ArrayList<BlackNumberInfo>();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值