Android 实现ListView滚动到底部自动加载数据
2014-06-13 17:22
886 查看
大概说下原理:
1.利用ListView的footer,来显示提示信息比如:正在加载中,也可以换成图标,或者自定义的控件;
2.利用OnScrollListener,滚动条监听器,判断滚动条滚动到底部的时候,设置listview的footer,在开启子线程加载数据,数据加载完毕后通知listview的adapter更新界面,在移除footer。
先上效果图:
MainActivity.java
MyAdapter.java
dataService.java
源码免费下载:http://download.csdn.net/download/qq247300948/7497127
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滚动到底后自动加载数据
- listview滚动到底部自动加载数据
- ListView滚动到底部自动加载更多数据
- [转]ListView滚动到底部自动加载数据
- Android Demo之旅 ListView底部添加加载更多按钮实现数据分页
- Android之ListView滚动到底后自动加载数据
- Android ListView滚动到底后自动加载数据
- Android之ListView滚动到底后自动加载数据
- 基于javascript实现浏览器滚动条快到底部时自动加载数据
- Android之ListView滚动到底后自动加载数据(转)
- android Listview下拉滚动时自动加载数据
- listview滚动到底部自动加载数据
- ListView滚动到底部自动加载数据
- ListView滚动到底部自动加载下一页数据
- 基于javascript实现浏览器滚动条快到底部时自动加载数据
- Android实现ListView分页自动加载数据的方法
- Android之ListView滚动到底后自动加载数据
- android中listview滑动到底部自动加载数据后它的滑块自动回到第一项怎么解决?
- Android之ListView滚动到底后自动加载数据
- Android高手进阶篇3-自定义ListView实现底部View自动隐藏和消失的功能