Anroid中ListView实现分页加载

本文介绍了一个基于Android平台的天气应用程序的开发过程,包括权限配置、布局设计、数据获取与解析、自定义适配器等内容。该应用通过网络请求获取天气数据,并使用Gson进行数据解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.需要开启权限,AndroidManifest.xml文件中

<uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

2.activity_main.xml文件中

 <com.t20.weather.view.RefreshListView
        android:id="@+id/lvWeather"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" >
    </com.t20.weather.view.RefreshListView>

3.MainActivity.java文件中

package com.t20.weather;

import java.util.List;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.lidroid.xutils.BitmapUtils;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import com.lidroid.xutils.http.client.HttpRequest.HttpMethod;
import com.t20.weather.entity.Weather;
import com.t20.weather.view.RefreshListView;
import com.t20.weather.view.RefreshListView.OnRefreshListener;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.app.Activity;

public class MainActivity extends Activity {
	private List<Weather> weatherList;
	private RefreshListView lvWeather;// 升级后的ListView控件,在RefreshListView.java中进行升级强化
	private MyAdapator myAdapator;// 自定义适配器
	private Integer pageIndex = 1;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// 获得控件
		lvWeather = (RefreshListView) findViewById(R.id.lvWeather);

		final HttpUtils hu = new HttpUtils();
		//xxx.xxx.xxx.xxx代表要连接的ip地址
		hu.send(HttpMethod.GET,
				"http://xxx.xxx.xxx.xxx:8088/WeatherHT/WeatherServlet?pageIndex="
						+ pageIndex, new RequestCallBack<String>() {

					/**
					 * 成功
					 */
					@Override
					public void onSuccess(ResponseInfo<String> responseInfo) {
						// 获得返回的结果
						String ret = responseInfo.result;

						// 利用Gson解析数据
						Gson gson = new Gson();
						weatherList = gson.fromJson(ret,
								new TypeToken<List<Weather>>() {
								}.getType());

						// 自定义适配器
						myAdapator = new MyAdapator();
						lvWeather.setAdapter(myAdapator);

						// 显示下一页数据
						pageIndex++;

						lvWeather.setOnRefreshListener(new OnRefreshListener() {

							@Override
							public void refresh() {
								//xxx.xxx.xxx.xxx代表要连接的ip地址
								hu.send(HttpMethod.GET,
										"http://xxx.xxx.xxx.xxx:8088/WeatherHT/WeatherServlet?pageIndex="
												+ pageIndex,
										new RequestCallBack<String>() {

											@Override
											public void onSuccess(
													ResponseInfo<String> responseInfo) {
												// TODO Auto-generated method
												// stub
												// 获取到剩下的数据
												String ret = responseInfo.result;

												// 数据全部显示完毕后给出提示
												if (ret.equals("no")) {
													Toast.makeText(
															MainActivity.this,
															"信息已经全部加载完成!",
															Toast.LENGTH_SHORT)
															.show();
												} else {
													List<Weather> wList = new Gson()
															.fromJson(
																	ret,
																	new TypeToken<List<Weather>>() {
																	}.getType());

													// 将剩下的数据全部放入到wList集合中
													weatherList.addAll(wList);

													// 通知ListView进行内容刷新
													myAdapator
															.notifyDataSetChanged();

													// 显示完一页后再准备显示下一页
													pageIndex++;
												}

												// 数据全部加载完毕,关闭网络请求,隐藏底部加载部分(refresh_foot_view.xml的样式)
												lvWeather.loadFinish();

											}

											@Override
											public void onFailure(
													HttpException error,
													String msg) {

												// 数据全部加载完毕,关闭网络请求,隐藏底部加载部分(refresh_foot_view.xml的样式)
												lvWeather.loadFinish();
											}

										});

							}
						});
					}

					/**
					 * 错误,异常
					 */
					@Override
					public void onFailure(HttpException error, String msg) {
						// TODO Auto-generated method stub
						Log.e("错误信息", msg);
					}
				});
	}

	/**
	 * 自定义适配器
	 * 
	 * @author Administrator
	 * 
	 */
	class MyAdapator extends BaseAdapter {

		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			return weatherList.size();// 数量
		}

		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return null;
		}

		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return 0;
		}

		@Override
		public View getView(int position, View v, ViewGroup parent) {
			// 将list_view布局放到ListView中
			v = View.inflate(MainActivity.this, R.layout.list_item, null);
			// 获取要显示数据的控件,控件在list_view中
			TextView tvCity = (TextView) v.findViewById(R.id.tvCity);
			TextView tvType = (TextView) v.findViewById(R.id.tvType);
			TextView tvTemp = (TextView) v.findViewById(R.id.tvTemp);
			ImageView ivImg = (ImageView) v.findViewById(R.id.ivImg);

			// 显示相应的数据
			tvCity.setText(weatherList.get(position).getCity());
			tvType.setText(weatherList.get(position).getType());
			tvTemp.setText(weatherList.get(position).getTemp() + "");

			// 显示图片
			BitmapUtils bitmapUtils = new BitmapUtils(MainActivity.this);
			bitmapUtils.display(ivImg, weatherList.get(position).getImg());

			return v;
		}

	}
}
4.list_item.xml文件中
 <ImageView
        android:id="@+id/ivImg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" 
        android:layout_weight="1"/>

    <TextView
        android:id="@+id/tvCity"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="15dp"
        android:layout_marginTop="14dp"
        android:text="城市" 
        android:layout_weight="1"/>

    <TextView
        android:id="@+id/tvType"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="15dp"
        android:layout_marginTop="14dp"
        android:text="天气类型"
        android:layout_weight="1" />

    <TextView
        android:id="@+id/tvTemp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="15dp"
        android:layout_marginTop="14dp"
        android:text="温度" 
        android:layout_weight="1"/>

5.refresh_foot_view.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" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_below="@+id/progressBar1"
            android:layout_marginRight="76dp"
            android:layout_marginTop="17dp"
            android:text="玩命加载中..."
            android:textAppearance="?android:attr/textAppearanceMedium" />

        <ProgressBar
            android:id="@+id/progressBar1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/textView1"
            android:layout_alignParentTop="true"
            android:layout_marginLeft="20dp" />
    </RelativeLayout>

</LinearLayout>

6.RefreshListView.java文件中

package com.t20.weather.view;

import com.t20.weather.R;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListView;

public class RefreshListView extends ListView {
	private View footView;
	private int mHeight;// 测量的底部高度
	private boolean loadFlag = false;// 判断是否正在加载,true表示正在加载

	public RefreshListView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		// TODO Auto-generated constructor stub
		initRefreshListView();
	}

	public RefreshListView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		initRefreshListView();
	}

	public RefreshListView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
		initRefreshListView();
	}

	/**
	 * 初始化方法
	 */
	public void initRefreshListView() {
		footView = View.inflate(getContext(), R.layout.refresh_foot_view, null);

		// 将布局追加到ListView的脚部(底部)
		addFooterView(footView);

		// 量布局的高度,0的意思是从0刻度开始量
		// 低版本有一个严重的Bug,不支持相对布局,但是在Level17以后得到修复,可以利用线性布局包住相对布局
		footView.measure(0, 0);

		// 量到高度
		mHeight = footView.getMeasuredHeight();

		// 利用内边距实现隐藏加载部分,若要显示则将-mHeight改成0
		footView.setPadding(0, -mHeight, 0, 0);

		// 设置监听
		this.setOnScrollListener(new OnScrollListener() {

			/**
			 * 滚动状态改变(由滚动到静止或由静止到滚动)
			 */
			@Override
			public void onScrollStateChanged(AbsListView view, int scrollState) {
				// TODO Auto-generated method stub

			}

			/**
			 * 滚动过程中
			 */
			@Override
			public void onScroll(AbsListView view, int firstVisibleItem,
					int visibleItemCount, int totalItemCount) {
				// 监听是否滚动到最后一刻,getCount() - 1表示已经滚动到最后
				//滚动到最后时,开始加载
				if (getLastVisiblePosition() == getCount() - 1) {
					// 显示底部加载部分
					footView.setPadding(0, 0, 0, 0);

					// 在准备进行加载时,如果没有在进行加载并且接口对象不为空时,才进行数据刷新,此时数据正在加载,加载状态变为true
					if (loadFlag == false) {
						if (onRefreshListener != null) {
							onRefreshListener.refresh();
							loadFlag = true;
						}
					}
				}

			}

		});

	}

	/**
	 * 定义网络连接接口,让外部调用
	 * 
	 * @author Administrator
	 * 
	 */
	public interface OnRefreshListener {
		// 定义刷新数据方法,在MainActivity.java文件中刷新加载下一页数据时调用并实现
		void refresh();
	}

	// 接口对象
	private OnRefreshListener onRefreshListener;

	/*
	 * 给接口对象设置setter和getter方便外部调用
	 */
	public OnRefreshListener getOnRefreshListener() {
		return onRefreshListener;
	}

	public void setOnRefreshListener(OnRefreshListener onRefreshListener) {
		this.onRefreshListener = onRefreshListener;
	}

	/**
	 * 数据全部加载完毕后,隐藏底部加载部分
	 */
	public void loadFinish() {
		footView.setPadding(0, -mHeight, 0, 0);
		// 完成加载,改变加载状态
		loadFlag = false;
	}

}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值