码迷,mamicode.com
首页 > 其他好文 > 详细

25.分批加载数据

时间:2015-10-30 18:31:06      阅读:248      评论:0      收藏:0      [点我收藏+]

标签:

解决数据库内容很多的情形;

  findAll()在该方法休眠3秒演示效果,需要创建一个线程去读取数据:

分批加载的好处:不用等待太久、节约流量、慢慢引导用户看感兴趣内容;

分批处理 解决的时候时间等待的问题

不能解决内存占用的问题

要想解决内存占用问题,可以采用分页方式;

1.创建数据库的代码中
  1. /**
  2. * 分批加载数据
  3. * @param startIndex 开始的位置
  4. * @param maxCount 每页展示的最大的条目
  5. * @return
  6. */
  7. public List<BlackNumberInfo> findPar2(int startIndex, int maxCount) {
  8. SQLiteDatabase db = helper.getReadableDatabase();
  9. Cursor cursor = db.rawQuery("select number,mode from blacknumber limit ? offset ?", new String[]{String.valueOf(maxCount),
  10. String.valueOf(startIndex)});
  11. List<BlackNumberInfo> blackNumberInfos = new ArrayList<BlackNumberInfo>();
  12. while (cursor.moveToNext()) {
  13. BlackNumberInfo blackNumberInfo = new BlackNumberInfo();
  14. blackNumberInfo.setMode(cursor.getString(1));
  15. blackNumberInfo.setNumber(cursor.getString(0));
  16. blackNumberInfos.add(blackNumberInfo);
  17. }
  18. cursor.close();
  19. db.close();
  20. return blackNumberInfos;
  21. }
  22. /**
  23. * 获取总的记录数
  24. * @return
  25. */
  26. public int getTotalNumber(){
  27. SQLiteDatabase db = helper.getReadableDatabase();
  28. Cursor cursor = db.rawQuery("select count(*) from blacknumber", null);
  29. cursor.moveToNext();
  30. int count = cursor.getInt(0);
  31. cursor.close();
  32. db.close();
  33. return count;
  34. }
2.在代码中展示:在LinearLayout中设置滚动监听
  1. public class CallSafeActivity extends Activity {
  2. private ListView list_view;
  3. private List<BlackNumberInfo> blackNumberInfos;
  4. private LinearLayout ll_pb;
  5. private BlackNumberDao dao;
  6. private CallSafeAdapter adapter;
  7. /**
  8. * 开始的位置
  9. */
  10. private int mStartIndex = 0;
  11. /**
  12. * 每页展示20条数据
  13. */
  14. private int maxCount = 20;
  15. /**
  16. * 一共有多少页面
  17. */
  18. private int totalPage;
  19. private int totalNumber;
  20. @Override
  21. protected void onCreate(Bundle savedInstanceState) {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_call_safe2);
  24. initUI();
  25. initData();
  26. }
  27. private Handler handler = new Handler() {
  28. @Override
  29. public void handleMessage(Message msg) {
  30. ll_pb.setVisibility(View.INVISIBLE);
  31. 让数据继续停留在当前位置两种实现方式:

     第一种:lv_call_sms_safe.setSelection(startIndex);//不推荐

     第二种:重复利用适配器,数据变化通知一下就行了

      private CallSmsSafeAdapter adapter;

      Handler里面修改成:

       if(adapter == null){

    adapter = new CallSmsSafeAdapter();

    lv_call_sms_safe.setAdapter(adapter);

    }else{

    //通知数据适配器更新一下界面

    adapter.notifyDataSetChanged();

    }

  32. if(adapter == null){
  33. adapter = new CallSafeAdapter(blackNumberInfos, CallSafeActivity.this);
  34. list_view.setAdapter(adapter);
  35. }else{
  36. adapter.notifyDataSetChanged();
  37. }
  38. }
  39. };
  40. private void initData() {
  41. dao = new BlackNumberDao(CallSafeActivity.this);
  42. //一共有多少条数据
  43. totalNumber = dao.getTotalNumber();
  44. new Thread() {
  45. @Override
  46. public void run() {
  47. //分批加载数据
  48. if (blackNumberInfos == null) {
  49. blackNumberInfos = dao.findPar2(mStartIndex, maxCount);
  50. } else {
  51. //把后面的数据。追加到blackNumberInfos集合里面。防止黑名单被覆盖
  52. blackNumberInfos.addAll(dao.findPar2(mStartIndex, maxCount));
  53. }
  54. handler.sendEmptyMessage(0);
  55. }
  56. }.start();
  57. }
  58. /**
  59. * 添加黑名单
  60. *
  61. * @param view
  62. */
  63. public void addBlackNumber(View view) {
  64. AlertDialog.Builder builder = new AlertDialog.Builder(this);
  65. final AlertDialog dialog = builder.create();
  66. View dialog_view = View.inflate(this, R.layout.dialog_add_black_number, null);
  67. final EditText et_number = (EditText) dialog_view.findViewById(R.id.et_number);
  68. Button btn_ok = (Button) dialog_view.findViewById(R.id.btn_ok);
  69. Button btn_cancel = (Button) dialog_view.findViewById(R.id.btn_cancel);
  70. final CheckBox cb_phone = (CheckBox) dialog_view.findViewById(R.id.cb_phone);
  71. final CheckBox cb_sms = (CheckBox) dialog_view.findViewById(R.id.cb_sms);
  72. btn_cancel.setOnClickListener(new View.OnClickListener() {
  73. @Override
  74. public void onClick(View v) {
  75. dialog.dismiss();
  76. }
  77. });
  78. btn_ok.setOnClickListener(new View.OnClickListener() {
  79. @Override
  80. public void onClick(View v) {
  81. String str_number = et_number.getText().toString().trim();
  82. if(TextUtils.isEmpty(str_number)){
  83. Toast.makeText(CallSafeActivity.this,"请输入黑名单号码",Toast.LENGTH_SHORT).show();
  84. return;
  85. }
  86. String mode = "";
  87. if(cb_phone.isChecked()&& cb_sms.isChecked()){
  88. mode = "1";
  89. }else if(cb_phone.isChecked()){
  90. mode = "2";
  91. }else if(cb_sms.isChecked()){
  92. mode = "3";
  93. }else{
  94. Toast.makeText(CallSafeActivity.this,"请勾选拦截模式",Toast.LENGTH_SHORT).show();
  95. return;
  96. }
  97. BlackNumberInfo blackNumberInfo = new BlackNumberInfo();
  98. blackNumberInfo.setNumber(str_number);
  99. blackNumberInfo.setMode(mode);
  100. blackNumberInfos.add(0,blackNumberInfo);
  101. //把电话号码和拦截模式添加到数据库。
  102. dao.add(str_number,mode);
  103. dialog.dismiss();
  104. }
  105. });
  106. dialog.setView(dialog_view);
  107. dialog.show();
  108. }
  109. private void initUI() {
  110. ll_pb = (LinearLayout) findViewById(R.id.ll_pb);
  111. //展示加载的圆圈
  112. ll_pb.setVisibility(View.VISIBLE);
  113. list_view = (ListView) findViewById(R.id.list_view);
  114. //设置listview的滚动监听
  115. list_view.setOnScrollListener(new AbsListView.OnScrollListener() {
  116. //状态改变时候回调的方法
  117. /**
  118. *
  119. * @param view
  120. * @param scrollState 表示滚动的状态
  121. *
  122. * AbsListView.OnScrollListener.SCROLL_STATE_IDLE 闲置状态
  123. * AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL 手指触摸的时候的状态
  124. * AbsListView.OnScrollListener.SCROLL_STATE_FLING 惯性
  125. */
  126. @Override
  127. public void onScrollStateChanged(AbsListView view, int scrollState) {
  128. switch (scrollState) {
  129. case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:
  130. //获取到最后一条显示的数据
  131. int lastVisiblePosition = list_view.getLastVisiblePosition();
  132. System.out.println("lastVisiblePosition==========" + lastVisiblePosition);
  133. if(lastVisiblePosition == blackNumberInfos.size() - 1){
  134. // 加载更多的数据。 更改加载数据的开始位置
  135. mStartIndex += maxCount;
  136. if (mStartIndex >= totalNumber) {
  137. Toast.makeText(getApplicationContext(),
  138. "没有更多的数据了。", Toast.LENGTH_SHORT).show();
  139. return;
  140. }
  141. initData();
  142. }
  143. break;
  144. }
  145. }
  146. //listview滚动的时候调用的方法
  147. //时时调用。当我们的手指触摸的屏幕的时候就调用
  148. @Override
  149. public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
  150. }
  151. });
  152. }
  153. private class CallSafeAdapter extends MyBaseAdapter<BlackNumberInfo> {
  154. private CallSafeAdapter(List lists, Context mContext) {
  155. super(lists, mContext);
  156. }
  157. @Override
  158. public View getView(int position, View convertView, ViewGroup parent) {
  159. ViewHolder holder;
  160. if (convertView == null) {
  161. convertView = View.inflate(CallSafeActivity.this, R.layout.item_call_safe, null);
  162. holder = new ViewHolder();
  163. holder.tv_number = (TextView) convertView.findViewById(R.id.tv_number);
  164. holder.tv_mode = (TextView) convertView.findViewById(R.id.tv_mode);
  165. holder.iv_delete = (ImageView) convertView.findViewById(R.id.iv_delete);
  166. convertView.setTag(holder);
  167. } else {
  168. holder = (ViewHolder) convertView.getTag();
  169. }
  170. holder.tv_number.setText(lists.get(position).getNumber());
  171. String mode = lists.get(position).getMode();
  172. if (mode.equals("1")) {
  173. holder.tv_mode.setText("来电拦截+短信");
  174. } else if (mode.equals("2")) {
  175. holder.tv_mode.setText("电话拦截");
  176. } else if (mode.equals("3")) {
  177. holder.tv_mode.setText("短信拦截");
  178. }
  179. final BlackNumberInfo info = lists.get(position);
  180. holder.iv_delete.setOnClickListener(new View.OnClickListener() {
  181. @Override
  182. public void onClick(View v) {
  183. String number = info.getNumber();
  184. boolean result = dao.delete(number);
  185. if (result) {
  186. Toast.makeText(CallSafeActivity.this, "删除成功", Toast.LENGTH_SHORT).show();
  187. lists.remove(info);
  188. //刷新界面
  189. adapter.notifyDataSetChanged();
  190. } else {
  191. Toast.makeText(CallSafeActivity.this, "删除失败", Toast.LENGTH_SHORT).show();
  192. }
  193. }
  194. });
  195. return convertView;
  196. }
  197. }
  198. static class ViewHolder {
  199. TextView tv_number;
  200. TextView tv_mode;
  201. ImageView iv_delete;
  202. }
  203. }











25.分批加载数据

标签:

原文地址:http://www.cnblogs.com/liuyu0529/p/4923709.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!