Android 实现ListView滚动到底部自动加载数据

大概说下原理:

1.利用ListView的footer,来显示提示信息比如:正在加载中,也可以换成图标,或者自定义的控件;

2.利用OnScrollListener,滚动条监听器,判断滚动条滚动到底部的时候,设置listview的footer,在开启子线程加载数据,数据加载完毕后通知listview的adapter更新界面,在移除footer。

先上效果图:



MainActivity.java

package com.example.list;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnScrollListener{

	ListView listView;
	List<Map<String,String>> list = new ArrayList();
	MyAdapter adapter;
	//底部footer
	View footer;
	//最大页数
	int maxPage = 5;
	//当前页数
	int page = 1;
	//每页显示数
	int pageSize = 20;
	//是否加载数据中
	boolean isLoading = false;
	//Toast显示状态
	boolean isToast = false;
	
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			if(msg.what == 1){
				//得到消息中的数据
				list.addAll((List)msg.obj);
				//告诉适配器,数据变化了,从新加载listview
				adapter.notifyDataSetChanged();
				//移除底部footer
				listView.removeFooterView(footer);
				//当前页数增加
				page++;
				//设置加载中为false
				isLoading = false;
			}else if(msg.what == 0){
				//设置加载中为false
				isToast = false;
			}
		}
	};
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		listView = (ListView)findViewById(R.id.lv);
		footer = LayoutInflater.from(this).inflate(R.layout.footer, null);
		list = DataService.getData(pageSize, page);
		adapter = new MyAdapter(this, list);
		//添加footer必须在setAdapter之前,不然会显示不出来
		listView.addFooterView(footer);
		listView.setAdapter(adapter);
		listView.setOnScrollListener(this);
		listView.removeFooterView(footer);
	}
	/**
	 * 滚动条状态,1是滑动,0是静止
	 */
	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		// TODO Auto-generated method stub
//		if(SCROLL_STATE_TOUCH_SCROLL == scrollState){
//			System.out.println("SCROLL_STATE_TOUCH_SCROLL  "+scrollState );
//		}else if(SCROLL_STATE_IDLE == scrollState){
//			System.out.println("SCROLL_STATE_IDLE  "+scrollState );
//		}
	}
	/**
	 * 监听移动滚动条
	 */
	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		// 如果正在加载,就return,防止加载多次
		if(isLoading)
			return;
		// 得到listview中显示在界面底部的id
		int lastItemid = listView.getLastVisiblePosition();
		// 如果是listview中显示在界面底部的id=滚动条中Item总数,说明滑动到底部了,并且当前页<=总页数
		if((lastItemid+1) == totalItemCount && page <= maxPage){
			if(page == maxPage){//到最后一页,提示(此方法有bug,会提示多次,,加个线程会好一点,但是还不能完全解决)
				if(!isToast){
					isToast = true;
					Toast.makeText(this, "没有更多的数据了...", 0).show();
					new Thread(){
						@Override
						public void run() {
							// TODO Auto-generated method stub
							try {
								Thread.sleep(3000);
							} catch (InterruptedException e) {
								e.printStackTrace();
							}
							handler.sendMessage(handler.obtainMessage(0, null));
						}
					}.start();
				}
				return;
			}
			//设置正在加载中
			isLoading = true;
			if(totalItemCount > 0){
				//现在底部footer
				listView.addFooterView(footer);
				new Thread(){
					@Override
					public void run() {
						// TODO Auto-generated method stub
						try {
							Thread.sleep(1000);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						List list  = DataService.getData(pageSize, page+1);
						handler.sendMessage(handler.obtainMessage(1, list));
					}
				}.start();
			}
		}
		//System.out.println("firstVisibleItem:"+firstVisibleItem+" visibleItemCount:"+visibleItemCount+" totalItemCount:"+totalItemCount);
	}
}



MyAdapter.java

package com.example.mylistview;

import java.util.List;
import java.util.Map;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;


public class MyAdapter extends BaseAdapter{
	
	List<Map<String,String>> list;
	
	Context context;
	
	public MyAdapter(Context context,List list){
		this.context = context;
		this.list = list;
	}
	
	@Override
	public int getCount() {
		// TODO Auto-generated method stub
		return list.size();
	}

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

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

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		ViewHolder viewHolder = new ViewHolder();
		if (convertView == null) {
			convertView = LayoutInflater.from(context).inflate(R.layout.list, null);
			viewHolder.id = (TextView) convertView.findViewById(R.id.id);
			viewHolder.name = (TextView) convertView.findViewById(R.id.name);
			viewHolder.phone = (TextView) convertView.findViewById(R.id.phone);
			convertView.setTag(viewHolder);
		}else{
			viewHolder = (ViewHolder)convertView.getTag();
		}
		// 设置应用名称
		Map<String,String> map = list.get(position);
		viewHolder.id.setText(map.get("id"));
		viewHolder.name.setText(map.get("name"));
		viewHolder.phone.setText(map.get("phone"));
		return convertView;		
	}
	
	private static class ViewHolder { 
        public TextView id,name,phone; 
    } 
}

dataService.java

package com.example.mylistview;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class DataService {

	public static List<Map<String,String>> getData(int pageSize,int page){
		List<Map<String,String>> list = new ArrayList();
		int index = (pageSize*(page-1)+1);
		int max = pageSize * page;
		for(int i = index; i <= max; i++){
			Map<String,String> map = new HashMap();
			map.put("id", "ID:"+i);
			map.put("name", "姓名:"+i);
			map.put("phone", "电话:"+i);
			list.add(map);
		}
		return list;
	}
}

源码免费下载: http://download.csdn.net/download/qq247300948/7497127

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值