app分页加载

当天告警的记录数有时候高达上万条,一次性加载的话会很慢

方案:

分页加载,每页加载100条,当用户上滑到最后一条时,加载下一页

实施:

百度了一下,需要使用外部jar包【SmartRefreshLayout】,app已经挺大的了,每次打包 apk 都要好久,想利用项目中原有的东西来开发

问题:

项目中只有一个下拉刷新的功能,想借用这个功能来实现我的分页加载目的

改方案:

加载数据时,每页加载100条,但是加载后时间最新的,显示在最后面,加载完成后,listwiew focus到最后一条记录,向上划动,查看日期老一点的数据,滑动到最上面时,加载下一页数据

搞定!代码如下:

    private void initRefresh(){
        mWaveSwipeRefreshLayout.setColorSchemeColors(Color.WHITE, Color.WHITE);//设置水滴中旋转动画的颜色,参数1:水滴落下过程中的颜色,参数2:水滴已经落下后的颜色
        mWaveSwipeRefreshLayout.setWaveColor(0xFF00706b);//设置水滴样色
        mWaveSwipeRefreshLayout.setMaxDropHeight(300);//设置最大下拉高度
        mWaveSwipeRefreshLayout.setOnRefreshListener(new WaveSwipeRefreshLayout.OnRefreshListener(){
            @Override
            public void onRefresh() {
                 new GetAlarmInfoTask().execute();
                 mWaveSwipeRefreshLayout.setRefreshing(false);
            }
        });
    }

 

    class GetAlarmInfoTask extends AsyncTask<Void, Void, String> {

        @Override
        protected String doInBackground(Void... arg) {
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("orgCode", MyApplication.orgCode));
            params.add(new BasicNameValuePair("page", page + ""));
            page++;
            return HttpUtil.invoke(Constants.URL_todayAlarmData, params,
                    Base64.encode(MyApplication.auth.getBytes()));
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            if (result != null) {
                try {
                    if (JSONParseUtil.parseDataInfo(result) != null) {
                        
                        List<HistoryAlarmInfo> list = JSONParseUtil
                                .parseHistoryAlarmInfoList(JSONParseUtil.parseDataInfo(result));
                        
                        for (HistoryAlarmInfo obj : list) {
                            historyAlarmInfoList.add(0, obj);
                        }
                        
                        if (list.size() > 0) {
                            ll_no_alarm.setVisibility(View.GONE);
                            now_listview.setVisibility(View.VISIBLE);
                            now_clear.setVisibility(View.VISIBLE);
                            
                            if (myHistoryAdapter != null) {
                                myHistoryAdapter.notifyDataSetChanged();
                            } else {
                                myHistoryAdapter = new MyHistoryAdapter();
                                now_listview.setAdapter(myHistoryAdapter);
                            }
                            
                            scrollMyListViewToBottom(list.size() - 1);
                        } else if (historyAlarmInfoList.size() > 0) {
                            Toast.makeText(context, "No more data!", Toast.LENGTH_LONG).show();
                        }
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    private void scrollMyListViewToBottom(final int pos) {
        now_listview.post(new Runnable() {
            @Override
            public void run() {
                // Select the last row so it will scroll into view...
                now_listview.setSelection(pos);
            }
        });
    }

注意这个 now_listview.post ,在列表加载完成后,再处理的代码块,这里选中最后一行,必须是列表加载完成以后再执行才能达到效果。

上一篇:C#中(int)a和Convert.ToInt32(a)有什么区别


下一篇:一手遮天 Android - view(ListView): ListView 通过 SimpleAdapter 显示数据