package com.administrator.listviewpager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
/**
* 分页:
* 监听滑动事件
* 通过onScroll方法获得是否到底部
* 通过onScrollStateChanged方法监听停止滑动,且滑动到达底部,且异步任务未执行时启动异步任务获取分页数据
*/
public class MainActivity extends AppCompatActivity implements AbsListView.OnScrollListener{
private ListView lv;
private TextView tv;
private ArrayAdapter aa;
private List<String> list;
//当前页数
private int pager = 1;
//每页条目数
private int num = 20;
//初始visibleItemCount
private int mVisibleItemCount = Integer.MAX_VALUE;
//是否到底
private boolean isBottom;
//是否正在执行异步任务
private boolean isStartTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView)this.findViewById(R.id.lv);
tv = (TextView)this.findViewById(R.id.tv);
list = new ArrayList<>();
aa = new ArrayAdapter(this,android.R.layout.simple_list_item_1,list);
lv.setAdapter(aa);
initData();
lv.setOnScrollListener(this);
}
/**
* 构造数据
*/
private void initData() {
for (int i=(pager-1)*num;i<pager*num;i++){
list.add("新闻"+(i+1));
}
aa.notifyDataSetChanged();
}
/**
* 加载分页数据
*/
private void nextPager(){
pager++;
initData();
}
/**
*
* @param view
* @param scrollState 滑动状态:1代表开始滑动,2代表手指离开后的惯性滑动,0代表停止滑动
*/
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// Log.i("sss", "scrollState" + scrollState);
switch (scrollState){
case AbsListView.OnScrollListener.SCROLL_STATE_IDLE://状态为0停止滑动
//判断滑到底部并且异步任务没有执行的时候
if (isBottom && !isStartTask){
//设置异步任务开始执行
isStartTask = true;
new Task().execute();
}
break;
case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL://状态为1开始滑动
break;
case AbsListView.OnScrollListener.SCROLL_STATE_FLING://状态为2惯性滑动
break;
}
}
/**
* 当firstVisibleItem与visibleItemCount的和为totalItemCount时为滑到底部
* @param view
* @param firstVisibleItem 可见的第一条数据下标
* @param visibleItemCount 屏幕可见的数据总数
* @param totalItemCount 该ListView数据总数
*/
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
//判断可见第一条下标为当前页第一条数据的时候
if (firstVisibleItem == (pager-1)*num && visibleItemCount!=0){
//判断mVisibleItemCount取最小值
if (visibleItemCount<mVisibleItemCount){
mVisibleItemCount = visibleItemCount;
}
}
// Log.i("aaa",mVisibleItemCount+" firstVisibleItem:"+firstVisibleItem);
// Log.i("aaa", "firstVisibleItem:" + firstVisibleItem
// +" visibleItemCount:"+ visibleItemCount
// +" totalItemCount:" + totalItemCount);
if (firstVisibleItem + mVisibleItemCount == totalItemCount){
//设置已到底部
isBottom = true;
}
}
/**
* 异步耗时任务
*/
class Task extends AsyncTask<Void,Integer,Void>{
@Override
protected void onPreExecute() {
super.onPreExecute();
tv.setVisibility(View.VISIBLE);
}
@Override
protected Void doInBackground(Void... params) {
for (int i=0;i<10;i++){
try {
Thread.sleep(500);
publishProgress(i);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
switch (values[0]%3){
case 0:
tv.setText("数据加载中...");
break;
case 1:
tv.setText("数据加载中.");
break;
case 2:
tv.setText("数据加载中..");
break;
}
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
//加载分页数据
nextPager();
// Log.i("aaa", pager + "");
tv.setVisibility(View.GONE);
//设置不为底部
isBottom = false;
//设置异步任务执行结束
isStartTask = false;
}
}
}