当天告警的记录数有时候高达上万条,一次性加载的话会很慢
方案:
分页加载,每页加载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 ,在列表加载完成后,再处理的代码块,这里选中最后一行,必须是列表加载完成以后再执行才能达到效果。