分析:
* 1.初始控件,展示第一页数据
* 2.设置触发条件
* 1.设置滚动监听
* 2.判断是否在底部
* 3.判断是否停止滚动
* 4.更改网络请求参数为下一页
* 5.异步网络请求
* 6.解析成新的集合
* 7.把新的集合添加到之前的集合中
* 8.更新数据
* 3.添加 加载过程中对话框提示正在加载的功能

layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <ListView
android:id="@+id/listView"
android:layout_height="match_parent"
android:layout_width="wrap_content"></ListView> </RelativeLayout>

listview_news.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView
android:id="@+id/tv_sublect"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
/>
<ImageView
android:id="@+id/img_cover"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/> </LinearLayout>

HttpUtils.java

package HttpUtils;

import java.io.IOException;
import java.io.StringReader; import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; public class HttpUtils {
//从网络下载json数据
public static String getJsonDataByIntetnet(String path){
byte[] buffer= getByteArrayByIntetnet(path);
if(buffer != null && buffer.length != 0){
return new String(buffer);
}
return null; }
//从网络获取字节数组
public static byte[] getByteArrayByIntetnet(String path){
try {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(path);
HttpResponse httpResponse = client.execute(httpGet);
if(200 == httpResponse.getStatusLine().getStatusCode()){
HttpEntity entity = httpResponse.getEntity();
return EntityUtils.toByteArray(entity);
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}return null; }
//从网络上获取Bitmap对象
public static Bitmap getBitmapByIntetnet(byte[] byteArray){
if(byteArray != null && byteArray.length != 0){
return BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
}
return null; }
}

ParseJson.java

package parserJson;

import java.util.ArrayList;
import java.util.List; import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject; import com.example.News; public class ParserJson {
public static List<News> parseJson(String json){
try {
JSONObject jsonObject = new JSONObject(json);
JSONObject jsonObject2 = jsonObject.getJSONObject("paramz");
JSONArray jsonArray = jsonObject2.getJSONArray("feeds");
List<News>dataList = new ArrayList<News>();
News news;
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject3 = jsonArray.getJSONObject(i);
news = new News();
JSONObject jsonObject4 = jsonObject3.getJSONObject("data");
news.setTv_subject(jsonObject4.getString("subject"));
news.setImg_cover(jsonObject4.getString("cover"));
dataList.add(news);
}
return dataList;
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null; }
}

Constants.java

package com.example;
/**
* 将需要下载数据的网址隔开,实现分页下载的目的
* @author my
*
*/
public class Constants {
public static final String pathBefore="http://litchiapi.jstv.com/api/GetFeeds?column=0&PageSize=10&pageIndex=";
public static final String pathAfter = "&val=100511D3BE5301280E0992C73A9DEC41";
}

News.java

package com.example;
/**
* 新闻类
* @author my
*
*/
public class News {
private String tv_subject;
private String img_cover;
public String getTv_subject() {
return tv_subject;
}
public void setTv_subject(String tv_subject) {
this.tv_subject = tv_subject;
}
public String getImg_cover() {
return img_cover;
}
public void setImg_cover(String img_cover) {
this.img_cover = img_cover;
}
@Override
public String toString() {
return "News [tv_subject=" + tv_subject + ", img_cover=" + img_cover
+ "]";
} }

UpdateNewView.java

package com.example;

import java.util.List;

/**
* 更新视图
* @author my
*
*/
public interface UpdateNewView {
public void updateNewView(List<News> dataList);
}

UpdateImageView.java

package com.example;

import android.graphics.Bitmap;
/**
* 更新图片
* @author my
*
*/
public interface UpdateImageView {
public void updateImageView(Bitmap bitmap);
}

DownLoadData_AsyncTask.java

package com.example;

import java.util.List;

import parserJson.ParserJson;
import HttpUtils.HttpUtils;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.util.Log;
/**
* 异步任务类下载数据
* @author my
*
*/
public class MyAsyncTask extends AsyncTask<String, Integer, List<News>>{
private Context context;
private UpdateNewView updateNewView;
private String TAG = "MainActivity";
private ProgressDialog progressDialog; public MyAsyncTask(Context context, UpdateNewView updateNewView) {
super();
this.context = context;
this.updateNewView = updateNewView;
}
/**
* 在执行异步下载之前调用
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
//创建进度条对话框
progressDialog = new ProgressDialog(context);
//设置标题
progressDialog.setTitle("加载数据");
//设置信息
progressDialog.setMessage("玩命加载...");
//进度条展示
progressDialog.show();
}
/**
* 执行异步下载数据操作
*/
@Override
protected List<News> doInBackground(String... params) {
//从网络获取json数据
String jsonDataByIntetnet = HttpUtils.getJsonDataByIntetnet(params[0]);
//解析json数据到集合
List<News> dataList = ParserJson.parseJson(jsonDataByIntetnet); return dataList;
}
/**
* 接收doInBacground传过来的数据,并回传给接口的实现方法中
*/
@Override
protected void onPostExecute(List<News> result) {
super.onPostExecute(result);
//移除对话框,展示页面
progressDialog.dismiss();
if(result != null && result.size() != 0){
updateNewView.updateNewView(result);//接口回调
}
}
}

DownLoadImg_AsyncTask.java

package com.example;

import HttpUtils.HttpUtils;
import android.graphics.Bitmap;
import android.os.AsyncTask;
/**
* 异步任务实现类下载图片
* @author my
*
*/
public class DownLoadImgAsyncTask extends AsyncTask<String, Integer, Bitmap>{
private UpdateImageView updateImageView; public DownLoadImgAsyncTask(UpdateImageView updateImageView) {
super();
this.updateImageView = updateImageView;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Bitmap doInBackground(String... params) {
byte[] byteArrayByIntetnet = HttpUtils.getByteArrayByIntetnet(params[0]);
Bitmap bitmapByIntetnet = HttpUtils.getBitmapByIntetnet(byteArrayByIntetnet); return bitmapByIntetnet;
}
@Override
protected void onPostExecute(Bitmap result) {
super.onPostExecute(result);
if(result != null ){
updateImageView.updateImageView(result);
}
}
}

Main.java

package com.example;

import java.util.ArrayList;
import java.util.List; import com.example.day09_listview_page.R;
import com.example.day09_listview_page.R.drawable;
import com.example.day09_listview_page.R.id;
import com.example.day09_listview_page.R.layout; import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.ListView;
import android.widget.TextView; public class MainActivity extends Activity {
private int index = 1;
private ListView listView;
private boolean isBottom;
private MyAdapter adapter;
//设置数据集合
private List<News> dataList1 = new ArrayList<News>(); @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化控件
listView = (ListView) findViewById(R.id.listView);
//设置数据
/**
* 创建异步任务下载数据
*/
new MyAsyncTask(MainActivity.this,new UpdateNewView() { @Override
public void updateNewView(List<News> dataList) {
//填充第一页数据
dataList1.remove(dataList1);
dataList1.addAll(dataList);
//创建适配器
adapter = new MyAdapter();
//适配器控件设置适配器
listView.setAdapter(adapter);
}
}).execute(Constants.pathBefore+index+Constants.pathAfter);
/**
* 设置listView滚动监听事件:添加新的页面的数据
*/
listView.setOnScrollListener(new OnScrollListener() {
/**
* 当滚动状态改变的时候调用
*/
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//滚动停止并且页面滑动到底部,执行异步下载下一页的操作
if(scrollState==SCROLL_STATE_IDLE && isBottom){
index += 1;//页数加1
new MyAsyncTask(MainActivity.this,new UpdateNewView() {
@Override
public void updateNewView(List<News> dataList) {
dataList1.addAll(dataList1);//添加回传过来的集合
adapter.notifyDataSetChanged();//通知刷新数据,listview里面的item发生变化时调用该方法更新数据
}
}).execute(Constants.pathBefore+index+Constants.pathAfter);
} }
/**
* 当listView滚动的时候调用
*/
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
isBottom =(firstVisibleItem + visibleItemCount==totalItemCount) ; }
}); }
class MyAdapter extends BaseAdapter{ @Override
public int getCount() {
return dataList1.size();
} @Override
public Object getItem(int position) {
return dataList1.get(position);
} @Override
public long getItemId(int position) {
return position;
}
//为适配器控件的每条item的view组件设置数据
@Override
public View getView(int position, View convertView, final ViewGroup parent) {
View view = convertView;
final ViewHolder viewHolder;
if(view == null){
view= View.inflate(MainActivity.this, R.layout.listview_news, null);
viewHolder = new ViewHolder();
viewHolder.tv_subject = (TextView)view.findViewById(R.id.tv_sublect);
viewHolder.img_cover = (ImageView) view.findViewById(R.id.img_cover);
view.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) view.getTag();
}
News news = dataList1.get(position);
viewHolder.tv_subject.setText(news.getTv_subject());
//设置默认图片
viewHolder.img_cover.setImageResource(R.drawable.ic_launcher);
final String imgPath = news.getImg_cover();
//解决图片错乱问题,给图片设置一个标记
viewHolder.img_cover.setTag(imgPath);
//创建一个异步任务下载图片
new DownLoadImgAsyncTask(new UpdateImageView() { @Override
public void updateImageView(Bitmap bitmap) {
//适配器控件通过标记找到view控件
ImageView imageView= (ImageView) parent.findViewWithTag(imgPath);
//设置图片
            if(iamgeView != null){
  imageView.setImageBitmap(bitmap);
            }
}
}).execute(imgPath);
return view;
} }
class ViewHolder{
private TextView tv_subject;
private ImageView img_cover;
} }

Listview实现分页下载的更多相关文章

  1. Android中使用ListView实现分页刷新(线程休眠模拟)

    当要显示的数据过多时,为了更好的提升用户感知,在很多APP中都会使用分页刷新显示,比如浏览新闻,向下滑动到当前ListView的最后一条信息(item)时,会提示刷新加载,然后加载更新后的内容.此过程 ...

  2. Android中使用ListView实现分页刷新(线程休眠模拟)(滑动加载列表)

    当要显示的数据过多时,为了更好的提升用户感知,在很多APP中都会使用分页刷新显示,比如浏览新闻,向下滑动到当前ListView的最后一条信息(item)时,会提示刷新加载,然后加载更新后的内容.此过程 ...

  3. Android基本控件之listView(三)<用ListView实现分页加载>

    我们之前讨论了ListView的基本使用方法和ListView的优化 今天我们再来讨论一个关于ListView的一个新的东西~就是分页加载.那么什么是分页加载呢?简单点说,就是"下拉刷新&q ...

  4. android UI进阶之实现listview的分页加载

    上篇博文和大家分享了下拉刷新,这是一个用户体验非常好的操作方式.新浪微薄就是使用这种方式的典型. 还有个问题,当用户从网络上读取微薄的时候,如果一 下子全部加载用户未读的微薄这将耗费比较长的时间,造成 ...

  5. listView异步处理图片下载缓存

    package cn.wangmeng.test; import java.io.File;import java.io.FileOutputStream;import java.io.IOExcep ...

  6. ListView实现分页加载(一)制作Demo

    一.什么是分页加载 在下面的文章中,我们来讲解LitView分页加载的实现.什么是分页加载呢?我们先看几张效果图吧,如下:                                       ...

  7. Java分页下载

    需求.提供公共的可以按照一定条件查询出结果,并提供将查询结果全部下载功能(Excel.CSV.TXT),由于一次性查出结果放到内存会占用大量内存.需要支持分页模式查询出所有数据. 实现思路 1.在公共 ...

  8. PHP Excel 下载数据,并分页下载

    直接上代码: 调用下载Excel: $total=$duoduo->count(MOD.' as a',$where); $objExcel= SelfExcelObject(); //导出 i ...

  9. Android学习随笔--ListView的分页功能

    第一次写博客,可能格式,排版什么的会非常不美观,不过我主要是为了记录自己的Android学习之路,为了以后能有些东西回顾.既然是为了学习,那我肯定会吸收各位大大们的知道经验,有不足的地方请指出. 通过 ...

随机推荐

  1. Java Script 正则表达式的使用示例

    一.语法 1.1 在JS中的使用代码 var myregex = new RegExp("^[-]?[0-9][0-9]{0,2}\\.[0-9]{5,15}\\,\s*[-]?[0-9][ ...

  2. ZOJ 3469 Food Delivery 区间DP

    这道题我不会,看了网上的题解才会的,涨了姿势,现阶段还是感觉区间DP比较难,主要是太弱...QAQ 思路中其实有贪心的意思,n个住户加一个商店,分布在一维直线上,应该是从商店开始,先向两边距离近的送, ...

  3. HDU 1078 FatMouse and Cheese 记忆化搜索DP

    直接爆搜肯定超时,除非你加了某种凡人不能想出来的剪枝...555 因为老鼠的路径上的点满足是递增的,所以满足一定的拓补关系,可以利用动态规划求解 但是复杂的拓补关系无法简单的用循环实现,所以直接采取记 ...

  4. 每天一个linux 命令:which

    我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索:        which  查看可执行文件的位置.       whereis 查看文件的位置.         ...

  5. NOIP2011 计算系数

    1计算系数 给定一个多项式 (ax + by)k ,请求出多项式展开后 x n y m 项的系数. [输入] 输入文件名为 factor.in. 共一行,包含 5 个整数,分别为 a,b,k,n,m, ...

  6. matlab 函数说明—conv2

    conv 是卷积的意思,2表示2维卷积.   conv2的调用形式如下: 1. C = conv2(A,B) 这是最简单的一种调用形式,B作为卷积核在A的范围内滑动,若[ma na] =size(A) ...

  7. Visual Studio配置OpenCV设置全局的继承属性

    1.安装完毕OpenCV后,新建一个CLR空项目,将其取名为"SetingGlobalOpenCVDir"便于以后变更版本时修改.如下图所示: 2.点击"视图->其 ...

  8. Camtasia Studio的安装步骤

    总的来说: 1.安装 2.安装之后,进行汉化. 破解方法: 1):输入注册码安装 用户名:6-Y 注册码:GCABC-CPCCE-BPMMB-XAJXP-S8F6R 2):软件汉化 安装完成后使用汉化 ...

  9. 浅谈iOS中MVVM的架构设计与团队协作

    说到架构设计和团队协作,这个对App的开发还是比较重要的.即使作为一个专业的搬砖者,前提是你这砖搬完放在哪?不只是Code有框架,其他的东西都是有框架的,比如桥梁等等神马的~在这儿就不往外扯了.一个好 ...

  10. C++学习笔记(一):头文件和源文件

    说明: 当一个源文件(a.cpp)要调用另一个源文件(b.cpp)定义的方法时,需要在a.cpp中写上这个方法的声明(只需要该方法的名称.返回值和参数,类似Java的接口): 如果每次调用其他文件的方 ...