Android-下拉刷新

1:先定义一个listview控件。

2:定义模板视图:

3:定义底部view的视图:

4:编写源代码,实现下拉刷新的效果:

package com.huanglinbin.finsh;

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

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.SimpleAdapter;
import android.widget.Toast;

public class MainActivity extends Activity implements OnScrollListener {

	//私有化属性。
	private SimpleAdapter sa;
	private ListView lv;//listview
	private Button but;//按钮
	private ProgressBar pb;//加载条
	private List<Map<String,Object>> list;//集合
	//listview的底部view的视图。
	private View moreView;
	//异步加载器。
	private Handler handler;
	//设置最大的加载数,超过时就不再加载。
	private int maxNum;
	//最后可见条目索引。
	private int lastVisibleIndex;
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //设置最大的数据数(相当于数据库中所有的数据)
        maxNum = 50;
        //首先要先找到listview的控件。
        lv = (ListView) findViewById(R.id.listView1);
        //先实例化底部view的视图。
        moreView = getLayoutInflater().inflate(R.layout.but,null);
        
        //初始化数据。
        list = new ArrayList<Map<String,Object>>();
        //模拟数据库。
        for(int i=0;i<20;i++){
        	Map<String,Object> map = new HashMap<String, Object>();
        	map.put("tv1","第"+i+"标题");
        	map.put("tv2","第"+i+"内容");
        	list.add(map);
        }
        
        //实例化模拟器。
        sa = new SimpleAdapter(MainActivity.this,
        		list,
        		R.layout.item,
        		new String[]{"tv1","tv2"},
        		new int[]{R.id.tv1,R.id.tv2}
        );
        //加载底部的view的视图。注意一定要在setAdapter加载模拟器之前。
        lv.addFooterView(moreView);
        lv.setAdapter(sa);
        
        //给listview绑定滚动的监听事件。
        lv.setOnScrollListener(MainActivity.this);
       
        //获取到按钮。
        //but = (Button) findViewById(R.id.but);
        pb = (ProgressBar) findViewById(R.id.pb); 
        //异步加载器。
        handler = new Handler();
      
        //给按钮绑定点击的监听事件。
       /* but.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				//将进度条显示出来。
				pb.setVisibility(View.VISIBLE);
				//将按钮显示为不可见。
				but.setVisibility(View.GONE);
				//在这里进行异步数据的加载。(参数1:new 运行控件,参数2:异步加载的时间)
				handler.postDelayed(new Runnable() {
					
					@Override
					public void run() {
						//加载更多的数据。
						lostmove();
						//将进度条显示出来。
						pb.setVisibility(View.VISIBLE);
						//将按钮显示为不可见。
						but.setVisibility(View.GONE);
						//通知listview刷新数据。
						sa.notifyDataSetChanged();
					}
				},2000);
				
			}
		});*/
        
    }

    //定义每次加载数据的方法。
    private void lostmove(){
    	//获取到适配器中的数据。
    	int count = sa.getCount();
    	//进行判断数据不足加载数据时的判断。
    	if(count+5<maxNum){
    		//每次加载数据5条。
    		for(int i=count;i<count+5;i++){
    			Map<String,Object> map1 = new HashMap<String, Object>();
    			map1.put("tv1","第"+i+"标题");
    			map1.put("tv2","第"+i+"内容");
    			list.add(map1);
    		}
    	}else{
    		//数据不足5条数据加载的时候的数据加载。
    		for(int j=count;j<maxNum;j++){
    			Map<String,Object> map1 = new HashMap<String, Object>();
    			map1.put("tv1","第"+j+"标题");
    			map1.put("tv2","第"+j+"内容");
    			list.add(map1);
    		}
    	}
    }

    public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		//滚动时一直回调,直到停止滚动时才停止回调。单击时回调一次。
		//firstVisibleItem:当前能看见的第一个列表项ID(从0开始)
		//visibleItemCount:当前能看见的列表项个数(小半个也算)
		//totalItemCount:列表项共数
    	
    	// 计算最后可见条目的索引
		lastVisibleIndex = firstVisibleItem+visibleItemCount-1;
		//所有的列表项已经和最大的数据数相等时,则移除底部的listview的视图。
		if(totalItemCount == maxNum+1){
			//移除底部listview。
			lv.removeFooterView(moreView);
			Toast.makeText(MainActivity.this, "数据已经全部加载完毕!", Toast.LENGTH_SHORT).show();
		}
			
	}
	
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		//滑到底部后加载,判断listview已经停止滚动并且最后可视的条目等于adapter的条目
		if(scrollState==OnScrollListener.SCROLL_STATE_IDLE&&lastVisibleIndex==sa.getCount()){
			//将进度条显示出来。
			pb.setVisibility(View.VISIBLE);
			handler.postDelayed(new Runnable() {
				
				@Override
				public void run() {
					//加载更多的数据。
					lostmove();
					//将进度条显示出来。
					pb.setVisibility(View.VISIBLE);
					
					//通知listview刷新数据。
					sa.notifyDataSetChanged();
				}
			},2000);
			
		}
		
	}

	
    
   
}

  5:效果图:

 

posted @ 2016-12-01 20:16  黄林彬  阅读(373)  评论(0编辑  收藏  举报