LisetView下拉刷新实现思路:
1.在第一次给ListView设置适配器之前添加脚,之后移除脚,并加载第一次要显示的数据
adapter = new MyAdapter(total);
//脚
view = View.inflate(MainActivity.this,
R.layout.progress_before, null);
lv_page.addFooterView(view);
lv_page.setAdapter(adapter);
lv_page.removeFooterView(view);
2. a.监听lv的滚动状态(setOnScrollListener),
重写onScrollStateChanged方法,重写lv空闲时(OnScrollListener.SCROLL_STATE_IDLE)的事件
b.符合下列条件时进行更新加载:
当前处于没有加载的状态;
lv的最后一个条目的位置等于当前适配器条目个数-1;
lv的最后一个条目的位置不等于所需加载的全部条目-1;
c.加载数据通知主线程并更新lv
变更更新状态,加入脚
d.更新完成后,移除脚,变更更新状态
部分代码如下:
lv_page.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState) {
case OnScrollListener.SCROLL_STATE_IDLE:
Log.i("test", "滑动闲置监听了");
if (!isLoding
&& lv_page.getLastVisiblePosition() == adapter
.getLists().size() - 1
&& lv_page.getLastVisiblePosition() != totals
.size() - 1) {
lv_page.addFooterView(view);
lv_page.setSelection(adapter.getCount());
isLoding = true;
Log.i("test", "准备进入子线程更新集合");
new Thread() {
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("test", "滑动闲置进入线了程");
List<ListView1> lists = adapter.getLists();
List<ListView1> showRefresh = showRefresh(
totals, adapter.getLists().size(),
count);
lists.addAll(showRefresh);
handler.obtainMessage(RE_SUCCESS)
.sendToTarget();
Log.i("test", "lists" + lists);
Log.i("test", "滑动闲置结束线了程");
};
}.start();
;
}
break;
case OnScrollListener.SCROLL_STATE_FLING:
Log.i("test", "重重滑动监听了监听了");
break;
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
Log.i("test", "轻轻滑动监听了");
break;
default:
break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
}
});
更新完成后
// 之后更新集合数据
case RE_SUCCESS:
Log.i("test", "主线程接收到了更新消息");
adapter.notifyDataSetChanged();
<pre name="code" class="java"><span style="white-space:pre"> </span>// 更改标记,并移除脚
isLoding = false;lv_page.removeFooterView(view);Log.i("test", "adapter提醒更新了");break;