这次在一的基础上做了数据通过HttpClient远程获取显示 并且分页,首先看下效果吧:

以上就是效果图了 下面看下具体代码实现吧

主要代码和上节差不多

主入口代码:

  1. package com.tp.soft.app;
  2.  
  3. import java.io.IOException;
  4. import java.sql.Timestamp;
  5. import java.util.ArrayList;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9.  
  10. import org.apache.http.HttpResponse;
  11. import org.apache.http.HttpStatus;
  12. import org.json.JSONArray;
  13. import org.json.JSONException;
  14. import org.json.JSONObject;
  15.  
  16. import android.app.Activity;
  17. import android.content.Intent;
  18. import android.os.Bundle;
  19. import android.os.Handler;
  20. import android.text.format.Time;
  21. import android.util.Log;
  22. import android.view.LayoutInflater;
  23. import android.view.Menu;
  24. import android.view.View;
  25. import android.view.ViewGroup;
  26. import android.widget.AbsListView;
  27. import android.widget.AbsListView.OnScrollListener;
  28. import android.widget.AdapterView;
  29. import android.widget.AdapterView.OnItemClickListener;
  30. import android.widget.BaseAdapter;
  31. import android.widget.ListView;
  32. import android.widget.ProgressBar;
  33. import android.widget.TextView;
  34. import android.widget.Toast;
  35.  
  36. import com.tp.soft.entity.Article;
  37. import com.tp.soft.http.HttpUtil;
  38. import com.tp.soft.io.IOUtil;
  39. import com.tp.soft.util.Constant;
  40.  
  41. public class MainActivity extends Activity implements OnScrollListener, OnItemClickListener{
  42.  
  43. private ListView mListView;
  44.  
  45. private View mLoadMoreView;
  46.  
  47. private ProgressBar mLoadBtn;
  48.  
  49. private PageAdapter adapter;
  50.  
  51. private Handler handler = new Handler();
  52.  
  53. private int curPage;
  54.  
  55. private int visibleItemCount; // 当前窗口可见项总数
  56.  
  57. private int visibleLastIndex = ; //最后的可视项索引
  58.  
  59. private long total;
  60. @Override
  61. protected void onCreate(Bundle savedInstanceState) {
  62. super.onCreate(savedInstanceState);
  63. setContentView(R.layout.activity_main);
  64.  
  65. mLoadMoreView = getLayoutInflater().inflate(R.layout.loadmore, null);
  66. mLoadBtn = (ProgressBar) mLoadMoreView.findViewById(R.id.progressBar1);
  67. //mLoadBtn.setOnClickListener(this);
  68.  
  69. mListView = (ListView) findViewById(R.id.menuList);
  70.  
  71. mListView.addFooterView(mLoadMoreView);
  72. Map<String, Object> params = new HashMap<String, Object>();
  73. params.put("curPage", );
  74. params.put("limit", );
  75. List<Article> articleList = getArticleList(params);
  76. adapter = new PageAdapter(articleList);
  77. mListView.setAdapter(adapter);
  78.  
  79. //下拉滚动触发事件
  80. mListView.setOnScrollListener(this);
  81. mListView.setOnItemClickListener(this);
  82. }
  83.  
  84. private List<Article> getArticleList(Map<String, Object> params) {
  85. HttpResponse response = HttpUtil.getHttpResponse(Constant.FINDARTICLE, params, Constant.ENCODING);
  86. List<Article> articles = new ArrayList<Article>();
  87. if(response!=null){
  88. if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
  89. try{
  90. IOUtil ioUtil = new IOUtil();
  91. String resultJson = ioUtil.getJson(response.getEntity().getContent());
  92. JSONObject jsonObject = new JSONObject(resultJson);
  93. curPage = jsonObject.getInt("curPage");
  94. total = jsonObject.getLong("total");
  95. JSONArray jsonArray = jsonObject.getJSONArray("rows");
  96. for (int i = ; i < jsonArray.length(); i++) {
  97. JSONObject obj = jsonArray.getJSONObject(i);
  98. int id = obj.getInt("a_id");
  99. String title = obj.getString("title");
  100. String content = obj.getString("content");
  101. Timestamp creat_time = new Timestamp(obj.getLong("create_time"));
  102. Article article = new Article();
  103. article.setA_id(id);
  104. article.setTitle(title);
  105. article.setContent(content);
  106. article.setCreate_time(creat_time);
  107. articles.add(article);
  108. }
  109. }catch (IOException e) {
  110. e.printStackTrace();
  111. } catch (JSONException e) {
  112. e.printStackTrace();
  113. }
  114. }
  115. }
  116. return articles;
  117. }
  118.  
  119. @Override
  120. public boolean onCreateOptionsMenu(Menu menu) {
  121. getMenuInflater().inflate(R.menu.main, menu);
  122. return true;
  123. }
  124.  
  125. /*@Override
  126. public void onClick(View v) {
  127. mLoadBtn.setText("正在加载中...");
  128. MyRunnable r = new MyRunnable();
  129. handler.postDelayed(r, 2000);
  130. }*/
  131.  
  132. class MyRunnable implements Runnable{
  133. @Override
  134. public void run() {
  135. Log.e("visibleLastIndex", visibleLastIndex+"");
  136. if(visibleLastIndex== total + ){
  137. mListView.removeFooterView(mLoadMoreView);
  138. adapter.notifyDataSetChanged();
  139. Toast.makeText(MainActivity.this, "数据全部加载完成", Toast.LENGTH_SHORT).show();
  140. }else{
  141. loadMoreDate();
  142. }
  143.  
  144. //更新UI
  145. adapter.notifyDataSetChanged();
  146. //mLoadBtn.setText("查看更多...");
  147. }
  148. }
  149.  
  150. class PageAdapter extends BaseAdapter {
  151.  
  152. List<Article> itemList;
  153.  
  154. public PageAdapter(List<Article> itemList){
  155. this.itemList = itemList;
  156. }
  157.  
  158. @Override
  159. public View getView(int position, View convertView, ViewGroup parent) {
  160. if(convertView == null){
  161. convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.menu, null);
  162. }
  163. TextView titleView = (TextView) convertView.findViewById(R.id.showView);
  164. TextView contentView = (TextView) convertView.findViewById(R.id.content);
  165. titleView.setText(itemList.get(position).getTitle());
  166. contentView.setText(itemList.get(position).getContent());
  167.  
  168. return convertView;
  169. }
  170.  
  171. @Override
  172. public long getItemId(int position) {
  173. return position;
  174. }
  175.  
  176. @Override
  177. public Object getItem(int position) {
  178. return itemList.get(position);
  179. }
  180.  
  181. @Override
  182. public int getCount() {
  183. return itemList.size();
  184. }
  185.  
  186. public void addItem(Article article){
  187. itemList.add(article);
  188. }
  189. }
  190.  
  191. private void loadMoreDate() {
  192. Map<String, Object> params = new HashMap<String, Object>();
  193. params.put("curPage", curPage + );
  194. params.put("limit", );
  195. List<Article> articleList = getArticleList(params);
  196. for (Article article : articleList) {
  197. adapter.addItem(article);
  198. }
  199. }
  200.  
  201. @Override
  202. public void onScroll(AbsListView view, int firstVisibleItem,
  203. int visibleItemCount, int totalItemCount) {
  204. visibleLastIndex = totalItemCount;
  205. }
  206.  
  207. @Override
  208. public void onScrollStateChanged(AbsListView view, int scrollState) {
  209. //不滚动
  210. if(scrollState == OnScrollListener.SCROLL_STATE_IDLE){
  211. //滚动最底部
  212. if(view.getLastVisiblePosition() == view.getCount() -){
  213. //mLoadBtn.setText("正在加载中...");
  214. MyRunnable r = new MyRunnable();
  215. handler.postDelayed(r, );
  216. }
  217. }
  218.  
  219. }
  220.  
  221. @Override
  222. public void onItemClick(AdapterView<?> parent, View view, int position, long arg3) {
  223. ListView listView = (ListView) parent;
  224. Article article = (Article) listView.getItemAtPosition(position);
  225. Intent intent = new Intent(MainActivity.this, ArticleDetalActivity.class);
  226. intent.putExtra("article", article);
  227. startActivity(intent);
  228. }
  229.  
  230. }

文章详细信息显示ArticleDetalActivity代码:

  1. package com.tp.soft.app;
  2.  
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.os.Handler;
  7. import android.util.Log;
  8. import android.view.Menu;
  9. import android.view.View;
  10. import android.view.View.OnClickListener;
  11. import android.widget.ImageButton;
  12. import android.widget.TextView;
  13.  
  14. import com.tp.soft.entity.Article;
  15. import com.tp.soft.util.DateUtil;
  16.  
  17. public class ArticleDetalActivity extends Activity implements OnClickListener{
  18.  
  19. private Handler handler = new Handler();
  20.  
  21. private TextView mTitle;
  22. private TextView mContent;
  23. private TextView mTime;
  24.  
  25. private ImageButton mBackBtn;
  26.  
  27. @Override
  28. protected void onCreate(Bundle savedInstanceState) {
  29. super.onCreate(savedInstanceState);
  30. setContentView(R.layout.activity_article_detal);
  31.  
  32. mTitle = (TextView) findViewById(R.id.d_title);
  33. mContent = (TextView) findViewById(R.id.d_content);
  34. mTime = (TextView) findViewById(R.id.d_time);
  35.  
  36. mBackBtn = (ImageButton) findViewById(R.id.backBtn);
  37.  
  38. Intent intent = getIntent();
  39. Article article = (Article) intent.getSerializableExtra("article");
  40. mTitle.setText(article.getTitle());
  41. mContent.setText(article.getContent());
  42. mTime.setText("发表日期:"+DateUtil.timestampToStr(article.getCreate_time(), "yyyy-MM-dd HH:mm:ss"));
  43.  
  44. mBackBtn.setOnClickListener(this);
  45. }
  46.  
  47. @Override
  48. public boolean onCreateOptionsMenu(Menu menu) {
  49. // Inflate the menu; this adds items to the action bar if it is present.
  50. getMenuInflater().inflate(R.menu.article_detal, menu);
  51. return true;
  52. }
  53.  
  54. @Override
  55. public void onClick(View v) {
  56. ArticleDetalActivity.this.setResult(RESULT_OK, getIntent());
  57. ArticleDetalActivity.this.finish();
  58. }
  59. }

HttpUtil封装:

  1. package com.tp.soft.http;
  2.  
  3. import java.net.SocketTimeoutException;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import java.util.Map;
  7.  
  8. import org.apache.http.HttpResponse;
  9. import org.apache.http.NameValuePair;
  10. import org.apache.http.client.HttpClient;
  11. import org.apache.http.client.entity.UrlEncodedFormEntity;
  12. import org.apache.http.client.methods.HttpPost;
  13. import org.apache.http.conn.ClientConnectionManager;
  14. import org.apache.http.conn.ConnectTimeoutException;
  15. import org.apache.http.conn.params.ConnManagerParams;
  16. import org.apache.http.conn.scheme.PlainSocketFactory;
  17. import org.apache.http.conn.scheme.Scheme;
  18. import org.apache.http.conn.scheme.SchemeRegistry;
  19. import org.apache.http.conn.ssl.SSLSocketFactory;
  20. import org.apache.http.impl.client.DefaultHttpClient;
  21. import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
  22. import org.apache.http.message.BasicNameValuePair;
  23. import org.apache.http.params.BasicHttpParams;
  24. import org.apache.http.params.HttpConnectionParams;
  25. import org.apache.http.params.HttpParams;
  26.  
  27. import android.util.Log;
  28.  
  29. public class HttpUtil {
  30. public static HttpResponse getHttpResponse(String serverPath, Map<String, Object> params, String encoding){
  31. List<NameValuePair> pairs = new ArrayList<NameValuePair>();
  32. if(null != params && !params.isEmpty()){
  33. for(Map.Entry<String, Object> entry : params.entrySet()){
  34. pairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue().toString()));
  35. }
  36. }
  37.  
  38. HttpResponse response = null;
  39. try {
  40. HttpPost post = new HttpPost(serverPath);
  41. post.setEntity(new UrlEncodedFormEntity(pairs, encoding));
  42. response = getHttpClient().execute(post);
  43. }catch (ConnectTimeoutException e) {
  44. Log.e("提示", "连接超时");
  45. return null;
  46. } catch (SocketTimeoutException e) {
  47. Log.e("提示", "Socket连接超时");
  48. return null;
  49. } catch (Exception e) {
  50. Log.e("提示", e.getLocalizedMessage());
  51. return null;
  52. }
  53. return response;
  54. }
  55.  
  56. public static synchronized HttpClient getHttpClient(){
  57. HttpParams params = new BasicHttpParams();
  58. ConnManagerParams.setTimeout(params, );
  59. HttpConnectionParams.setConnectionTimeout(params, );
  60. HttpConnectionParams.setSoTimeout(params, );
  61.  
  62. // 设置我们的HttpClient支持HTTP和HTTPS两种模式
  63. SchemeRegistry schReg = new SchemeRegistry();
  64. schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), ));
  65. schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), ));
  66.  
  67. // 使用线程安全的连接管理来创建HttpClient
  68. ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);
  69. HttpClient client = new DefaultHttpClient(conMgr ,params);
  70. return client;
  71. }
  72. }

服务器代码:

  1. @POST
  2. @Path(value="/findArticle")
  3. @Produces(MediaType.APPLICATION_JSON)
  4. @Override
  5. public Result findArticleAll(@FormParam(value="curPage") String curPage, @FormParam(value="limit") String limit)throws BaseServiceException {
  6. Result result = new Result();
  7. List<Article> aList = new ArrayList<Article>();
  8. Article article = new Article();
  9. article.setPageable(true);
  10. article.setStart((Integer.parseInt(curPage) - ) * Integer.parseInt(limit));
  11. article.setLimit(Integer.parseInt(limit));
  12. try{
  13. aList = articleDao.find(article);
  14. }catch (DataAccessException e) {
  15. LOG.error("【ibatis】查询文章列表失败", e);
  16. throw new BaseServiceException(e.getLocalizedMessage());
  17. }
  18.  
  19. long total = ;
  20. try{
  21. total = articleDao.getTotal(article);
  22. }catch (DataAccessException e) {
  23. LOG.error("【ibatis】查询文章总数失败", e);
  24. throw new BaseServiceException(e.getLocalizedMessage());
  25. }
  26. result.setRows(aList);
  27. result.setCurPage(Integer.parseInt(curPage));
  28. result.setTotal(total);
  29. return result;
  30. }

核心代码就这么多了 界面代码就不一一贴出了

想要具体代码可以到http://download.csdn.net/detail/taopeng_100/7864393地址下载

ListView下拉加载二(分页)的更多相关文章

  1. ListView下拉加载一(分页)

    首先创建在主xml里放置一个listview列表,代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/r ...

  2. Flutter 开发从 0 到 1(四)ListView 下拉加载和加载更多

    在<APP 开发从 0 到 1(三)布局与 ListView>我们完成了 ListView,这篇文章将做 ListView 下拉加载和加载更多. ListView 下拉加载 Flutter ...

  3. WP & Win10开发:实现ListView下拉加载的两种方法

    1.通过ListView控件的ContainerContentChanging方法.该方法在列表项被实例化时触发,在列表项最后一个项目实例化的时候触发刷新数据逻辑就可以实现下拉加载了. 代码如下:// ...

  4. Windows Phone 8.1开发:如何让ListView下拉加载更多?

    Windows Phone 8.1开发中使用ListView作为数据呈现载体时,经常需要一个下拉(拇指向上滑动)加载更多的交互操作.如何完成这一操作呢?下面为您阐述. 思路是这样的: 1.在ListV ...

  5. android UI进阶之实现listview的下拉加载

    关于listview的操作五花八门,有下拉刷新,分级显示,分页列表,逐页加载等,以后会陆续和大家分享这些技术,今天讲下下拉加载这个功能的实现. 最初的下拉加载应该是ios上的效果,现在很多应用如新浪微 ...

  6. 微信小程序中如何实现分页下拉加载?(附源码)

    转眼间坚持写教你微信小程序系列已经有十节系列课程了,每天的工作压力繁重,小女子也不知道自己还能坚持这样的系列教程多久.只希望每篇教程真的对大家有帮助.这节课我们要介绍的就是如何实现分页的下拉加载,我们 ...

  7. Flutter学习笔记(25)--ListView实现上拉刷新下拉加载

    如需转载,请注明出处:Flutter学习笔记(25)--ListView实现上拉刷新下拉加载 前面我们有写过ListView的使用:Flutter学习笔记(12)--列表组件,当列表的数据非常多时,需 ...

  8. 集成iscroll 下拉加载更多 jquery插件

    一个插件总是经过了数月的沉淀,不断的改进而成的.最初只是为了做个向下滚动,自动加载的插件.随着需求和功能的改进,才有了今天的这个稍算完整的插件. 一.插件主功能: 1.下拉加载 2.页面滚动到底部自动 ...

  9. ASP.NET仿新浪微博下拉加载更多数据瀑布流效果

    闲来无事,琢磨着写点东西.貌似页面下拉加载数据,瀑布流的效果很火,各个网站都能见到各式各样的展示效果,原理大同小异.于是乎,决定自己写一写这个效果,希望能给比我还菜的菜鸟们一点参考价值. 在开始之前, ...

随机推荐

  1. 总结ThinkPHP使用技巧经验分享(一)

    约定:1.所有类库文件必须使用.class.php作为文件后缀,并且类名和文件名保持一致2.控制器的类名以Action为后 缀3.模型的类名以Model为后缀,类名第一个字母须大写4.数据库表名全部采 ...

  2. c/c++ qsort 函数的简单使用(1)

    #include <stdio.h> #include <stdlib.h> //打印数组元素 void print(int arr[], int n){ ; i < n ...

  3. servlet内置对象

    request                请求对象       类型javax.servlet.ServletRequest   作用域Request response              ...

  4. Jquery之树形插件

    1.DynaTree (推荐使用,说明文档以及样例在下载的压缩包里\doc\samples.html) DynaTree 是一个优化的动态jQuery树查看插件,它只在需要时才创建DOM元素.支持ch ...

  5. sklearn 增量学习 数据量大

    问题 实际处理和解决机器学习问题过程中,我们会遇到一些"大数据"问题,比如有上百万条数据,上千上万维特征,此时数据存储已经达到10G这种级别.这种情况下,如果还是直接使用传统的方式 ...

  6. Windows内核开发中如何区分文件对象究竟是文件还是文件夹?

    今天有同行问了一个问题,Windows文件过滤驱动里的如何去区分一个对象是文件还是文件夹?我花了1小时左右翻阅了一些微软的文档以及以前的遗留代码,发现在WDK的帮助文档中是这么定义的: FILE_OB ...

  7. 很好用的request转换为实体方法还有判断实体所有参数不能为空的方法

    /// <summary> /// 模型辅助处理类 /// 2016-04-18 /// </summary> public class ModelHelper { /// & ...

  8. app加固

    为什么要加固APP? 答:因为黑客通过反编译APK得到源码后,会在应用中插入代码,获取利益,比如添加广告,盗取用户账号.密码,后台定制活动等.   反编译的方法? 反编译是指apk文件通过反编译工具( ...

  9. python 学习(json)(转)

    Json简介:Json,全名 JavaScript Object Notation,是一种轻量级的数据交换格式.Json最广泛的应用是作为AJAX中web服务器和客户端的通讯的数据格式.现在也常用于h ...

  10. request_irq() | 注册中断服务函数【转】

    本文转载自:http://blog.csdn.net/wealoong/article/details/7566546#t0 参考  : ARM Linux 中断机制分析.pdf linux-2.6. ...