您的位置:首页 > 其它

ListView实现分页加载(三)实现分页加载

2015-10-10 15:18 375 查看
在上一篇中,我们实现了底部布局(即带上了进度条)。没有读过的朋友可以点击下面的链接:

/article/6123605.html

但是进度条的消失,以及数据的加载我们都没有实现,那么在本节中,我们来完成分页加载。具体的效果我就不贴图了,就是第一篇效果展示的那些效果。

代码还是 有些难度。需要用到回调接口,实现ListView的下拉监听等知识以及判断何时进度条出现何时消失等。

陈述一下具体逻辑吧。首先在initView中,我们不仅要加上底布局,还应该时底布局消失。然后我们实现ListView的OnScrollListener接口,监听它的滚动。在其中的一个方法onScroll,我们可以获得到当前第一个可见item的编号以及当前有多少个可见item和总共有多少个item。这样子我们就可以轻易由计算得出是否滚动带最底部了。然后在onSrollStateChanged方法中做判断,如果滚动到最底部,就显示出正在加载数据的进度条,并完成数据的加载。但是有一个问题是,加载的数据在MainActivity里面,我们怎么在MyListView中获得加载的数据?这就要使用接口回调,我们在MyListView中设定一个回调接口,然后在MainAcivty中回调,就可以实现MyListView获得加载的数据。 好了,大体逻辑就是这样子的,剩下的就是细节上的逻辑了。我们看代码,注释解释的也很清楚了。如下:

package com.fuly.load;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;

public class MyListView extends ListView implements OnScrollListener{

private int lastVisibleItem;//最后一个可见的item

private int totalItemCount;//总的item

private boolean isLoading = false;//是否正在加载数据

private ILoadListener mListener;//回调接口,用来加载数据

private View footer;//底布局

//注意,三个构造方法都要重写
public MyListView(Context context) {
super(context);
initView(context);

}
public MyListView(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public MyListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView(context);
}

//定义一个回调接口,用来获得要加载的数据
public interface ILoadListener{
void loadData();
}

public void setOnILoadListener(ILoadListener listener){

this.mListener = listener;
}

//初始化view
private void initView(Context context){

footer = LayoutInflater.from(context).inflate(R.layout.footer, null);

//注意,这句代码的意思是给自定义的ListView加上底布局
this.addFooterView(footer);

//首先需要隐藏这个底部布局
footer.findViewById(R.id.load_layout).setVisibility(View.GONE);

this.setOnScrollListener(this);//千万别忘记设定监听器

}

//加载数据完成后,需要执行的操作
public void loadFinish(){

isLoading = false;//不再加载了
//底布局也要隐藏
footer.findViewById(R.id.load_layout).setVisibility(View.GONE);

}

//参数scrollState表示滑动的状态
public void onScrollStateChanged(AbsListView view, int scrollState) {

//如果最后一个可见item等于总的item,且当前滚动状态为滚动停止,就应该开始加加载数据了
if(lastVisibleItem == totalItemCount && scrollState==SCROLL_STATE_IDLE){

if(!isLoading){
isLoading = true;

//加载数据
mListener.loadData();
//设置底布局可见
footer.findViewById(R.id.load_layout).setVisibility(View.VISIBLE);
}
}

}

/***
* 该方法用来监听实时滚动中的item
* firstVisibleItem:当前第一个可见的item
* visibleItemCount:当前总共有多少个可见的item
* totalItemCount:总的item
*/
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {

this.lastVisibleItem = firstVisibleItem + visibleItemCount;
this.totalItemCount = totalItemCount;

}

}


然后我们再修改MainActivity中的代码即可,如下:

package com.fuly.load;

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

import com.fuly.load.MyListView.ILoadListener;

import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;

public class MainActivity extends Activity implements ILoadListener{

private MyListView lv;
private List<MyData>  mDatas = new ArrayList<MyData>();
private MyAdapter mAdapter;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

initData();//该方法初始化数据
lv = (MyListView) findViewById(R.id.list_view);
lv.setOnILoadListener(this);
mAdapter = new MyAdapter(this, mDatas);
lv.setAdapter(mAdapter);

}

/**
* 该方法初始化数据,即提供初始的素材
*/
private void initData() {
for(int i = 0;i<12;i++){
MyData md = new MyData("你好,我是提前设定的");
mDatas.add(md);
}

}

/**
* 该方法提供模拟的加载数据
*/
private void getLoadData() {
for(int i = 0;i<3;i++){
MyData md = new MyData("你好,我是加载进来的");
mDatas.add(md);
}

}

//重写回调方法
public void loadData() {

//注意之所以使用Handlder,主要是想让下面的
//操作延迟5秒钟,以体现效果。实际开发中不需要
Handler mHandler = new Handler();
mHandler.postDelayed(new Runnable(){

public void run() {

//获得加载数据
getLoadData();
//然后通知MyListView刷新界面
mAdapter.notifyDataSetChanged();

//然后通知加载数据已经完成了

lv.loadFinish();
}

}, 5000);

}

}


好了,一切都OK了。运行吧,看看分页加载到底是什么效果!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: