android SwipeRefreshLayout与ListView结合实现下拉刷新,加载功能

package com.example.listviewdemo;

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


import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;

public class MainActivity extends Activity implements OnRefreshListener,OnScrollListener{
	
	private SwipeRefreshLayout swipeRefreshLayout;
	private ListView listView;
	private List<String> list = new ArrayList<String>();
	private ArrayAdapter<String> adapter ;
	private View footer;
	private boolean isfinsh = true;//是否加载完成
	private Handler handler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case 1:
				list.add("bbbbbbbbb1");
				adapter.notifyDataSetChanged();
				if(listView.getFooterViewsCount()>0){
					listView.removeFooterView(footer);
				}
				isfinsh = true;
				break;

			default:
				break;
			}
		};
	};
	

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		swipeRefreshLayout = (SwipeRefreshLayout)findViewById(R.id.rf);
		swipeRefreshLayout.setColorScheme(android.R.color.holo_blue_bright, android.R.color.holo_green_light,  
				android.R.color.holo_orange_light, android.R.color.holo_red_light);
		swipeRefreshLayout.setOnRefreshListener(this);
		listView = (ListView)findViewById(R.id.ls);
		footer = LayoutInflater.from(this).inflate(R.layout.footer, null, false);
		for(int i = 0 ;i<20;i++){
			list.add("aaaaaaaaa"+i);
		}
		adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
		listView.addFooterView(footer);
		listView.setAdapter(adapter);
		listView.removeFooterView(footer);
		listView.setOnScrollListener(this);
	}

	@Override
	public void onRefresh() {
		if(isfinsh){
			isfinsh = false;
			new ReTask().execute();
		}else{
			swipeRefreshLayout.setRefreshing(false);
		}
		
	}

	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		int countIndex = view.getLastVisiblePosition();
		Log.d("countIndex", ""+countIndex);
		Log.d("totalItemCount", ""+totalItemCount);
		if((countIndex+1) == totalItemCount){
			if(totalItemCount > 0){
				if(isfinsh){
					isfinsh = false;
					listView.addFooterView(footer);
					new GetTask().execute();
				}else{
					
				}
			}
		}
	}

	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		
	}
	
	private class ReTask extends AsyncTask<Void , Integer, Boolean>{

		@Override
		protected Boolean doInBackground(Void... arg0) {
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			return true;
		}
		
		@Override
		protected void onPostExecute(Boolean result) {
			super.onPostExecute(result);
			if(result){
				list.clear();
				for(int i = 0 ;i<20;i++){
					list.add("aaaaaaaaa"+i);
				}
				adapter.notifyDataSetChanged();
				swipeRefreshLayout.setRefreshing(false);
				isfinsh = true;
				}
		}
	}
	
	private class GetTask extends AsyncTask<Void , Integer, Boolean>{

		@Override
		protected Boolean doInBackground(Void... arg0) {
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			return true;
		}
		
		@Override
		protected void onPostExecute(Boolean result) {
			super.onPostExecute(result);
			if(result)
				handler.sendEmptyMessage(1);
		}
	}

}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/rf"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
        <ListView 
            android:id="@+id/ls"
            android:layout_width="match_parent"
        	android:layout_height="wrap_content"
        	android:scrollbars="none"
            ></ListView>
    </android.support.v4.widget.SwipeRefreshLayout>

</RelativeLayout>

footer.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="wrap_content"
    android:orientation="horizontal"
    android:gravity="center_horizontal"
    android:padding="8dp"
    >

    <ProgressBar android:id="@+id/c81_forthBar"
        android:layout_width="24dp"
    	android:layout_height="24dp"
         /> 
    <TextView android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:text="数据正在加载..."
    />
</LinearLayout>

注意在进行setAdapter时需addFooterView,添加完再removeFooterView,否则会报错

你可能感兴趣的:(android SwipeRefreshLayout与ListView结合实现下拉刷新,加载功能)