PullToRefreshListView进阶(四)----->上拉分批加载2种方式

*********************************************上拉分批加载方式1****************************************************

main.xml




    


MainActivity

package com.imooc.android_scrollview;

import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.ScrollView;
import android.widget.TextView;
import android.os.Build;

public class MainActivity extends Activity implements OnClickListener {

	private TextView tv;
	private ScrollView scroll;
	private Button up_btn;
	private Button down_btn;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.main);
		tv = (TextView) findViewById(R.id.content);
		tv.setText(getResources().getString(R.string.content));

		up_btn = (Button) findViewById(R.id.up);
		down_btn = (Button) findViewById(R.id.down);
		up_btn.setOnClickListener(this);
		down_btn.setOnClickListener(this);

		scroll = (ScrollView) findViewById(R.id.scroll);
		scroll.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				switch (event.getAction()) {
				case MotionEvent.ACTION_MOVE: {
					/**
					 * (1)getScrollY()————获取滚动条滑动的距离
					 * (2)getMeasuredHeight()包含隐藏的textview的高度
					 * (3)getHeight()显示在一屏幕的高度
					 */

					// 顶部状态
					if (scroll.getScrollY() <= 0) {
						Log.i("Main", "滑动到顶部");
					}

					// 底部状态
					// TextView的总高度<=一屏幕的高度+滚动条的滚动距离
					if (scroll.getChildAt(0).getMeasuredHeight() <= scroll
							.getHeight() + scroll.getScrollY()) {

						tv.append(getResources().getString(R.string.content));

					}
					break;
				}
				}

				return false;
			}
		});
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		// scrollTo:以滚动视图起始位置开始计算的(参考点游标)
		// scrollBy:相对前一次的位置,去滚动对应的距离(参考点游标)

		case R.id.up: {
			//定位到textview开始处
			scroll.scrollTo(0, 0);
			break;
		}

		case R.id.down: {

			scroll.scrollBy(0, 100);
			break;
		}
		}
	}
}

*********************************************上拉分批加载方式2****************************************************

主页面布局

activity_main.xml



    


listview的item布局




    



底部加载提示图标

footer.xml




    



DataService

package com.example.demo;

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

public class DataService {

	//加载数据
	public List getData(){
		List data = new ArrayList();
		for(int i = 0;i< 20;i++){
			data.add("分页加载的数据   " + i);
		}
		return data;
	}
}

MainActivity

package com.example.demo;

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

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.util.Log;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity {
	protected static final int SUCCESS_GET_DATA = 0;
	private ListView listview;
	private DataService service;
	private List data;// 加载的总数据
	private ArrayAdapter adapter;

	private boolean finish = true;// 是否加载完成

	private View footer;

	private Handler mHandler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case SUCCESS_GET_DATA:
				@SuppressWarnings("unchecked")
				ArrayList result = ((ArrayList) msg.obj);
				data.addAll(result);
				// 让listview自动刷新
				adapter.notifyDataSetChanged();
				finish = true;
				// 将页脚删除掉
				if (listview.getFooterViewsCount() > 0) {
					listview.removeFooterView(footer);
				}
				break;

			default:
				break;
			}
		};
	};

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//ListView控件
		listview = (ListView) findViewById(R.id.listview);
		service = new DataService();
		data = new ArrayList();
		List result = service.getData();
		//获取数据
		data.addAll(result);
		//适配器
		adapter = new ArrayAdapter(this, R.layout.item, R.id.tv_info,
				data);
		footer = View.inflate(this, R.layout.footer, null);
		// 在增加listview的页脚之前,需要提前设置一次
		listview.addFooterView(footer);
		//设置适配器
		listview.setAdapter(adapter);
		// 然后再次将页脚删除掉(可以解决第一次上拉的急闪情况)
		listview.removeFooterView(footer);
		// 滚动监听事件
		listview.setOnScrollListener(new MyOnScrollListener());
	}

	private final class MyOnScrollListener implements OnScrollListener {
		// 滚动状态发生改变时
		public void onScrollStateChanged(AbsListView view, int scrollState) {
			Log.i("i", " scrollState " + scrollState);
		}

		/**
		 * 界面展现
		 */
		public void onScroll(AbsListView view, int firstVisibleItem,
				int visibleItemCount, int totalItemCount) {
			// 最下面的条目数
			final int totalCount = firstVisibleItem + visibleItemCount;
			// 当翻到最后一条数据时
			if (totalCount == totalItemCount &&  finish) {
				// 已经移动到了listview的最后
				finish = false;
				// 添加页脚
				listview.addFooterView(footer);
				new Thread() {
					public void run() {
						SystemClock.sleep(3000);
						List result = service.getData();
						Message msg = new Message();
						msg.what = SUCCESS_GET_DATA;
						msg.obj = result;
						mHandler.sendMessage(msg);
					};
				}.start();
			}
		}
	}
}



你可能感兴趣的:(Android控件实例)