您的位置:首页 > 移动开发 > Android开发

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

2014-06-13 17:22 886 查看
大概说下原理:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android listview