您的位置:首页 > 移动开发 > Android开发

ListView分页显示 上拉加载更多

2016-08-05 10:27 351 查看
这是程序实现的效果



现在来分析是如何做到的

先来配置footermore的布局文件

<?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="match_parent"
android:orientation="vertical" >

<LinearLayout
android:id="@+id/footer_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:orientation="horizontal"
>

<ProgressBar
style="?android:attr/progressBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="正在加载,请稍等。。。" />
</LinearLayout>

</LinearLayout>


很简单就是一个progressbar和一个textview

然后新建一个LoadListView来将其加载。

public class LoadListView extends ListView implements OnScrollListener {
private View footer;// 底部布局
int totalItemCount;// 总数量
int lastVisibieItem;// 最后一个可见的item;
boolean isLoading;// 判断变量
IloadListener iLoadListener;// 接口变量

public LoadListView(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}

public LoadListView(Context context) {
super(context);
initView(context);
}

public LoadListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView(context);
// TODO Auto-generated constructor stub
}

// listview加载底部布局
private void initView(Context context) {
LayoutInflater inflater = LayoutInflater.from(context);
footer = inflater.inflate(R.layout.footermore, null);
// 设置隐藏底部布局
footer.findViewById(R.id.footer_layout).setVisibility(View.GONE);
this.addFooterView(footer);
this.setOnScrollListener(this);
}

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
if (totalItemCount == lastVisibieItem && scrollState == SCROLL_STATE_IDLE) {
if (!isLoading) {
isLoading = true;
footer.findViewById(R.id.footer_layout).setVisibility(View.VISIBLE);
// 加载更多(获取接口)
iLoadListener.onLoad();
}
}
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
this.lastVisibieItem = firstVisibleItem + visibleItemCount;
this.totalItemCount = totalItemCount;
}

public void setInterface(IloadListener iLoadListener) {

this.iLoadListener = iLoadListener;
}

// 加载更多数据的回调接口
public interface IloadListener {
public void onLoad();
}

// 加载完成通知隐藏
public void loadComplete() {
isLoading = false;
footer.findViewById(R.id.footer_layout).setVisibility(View.GONE);

}
}


此段代码先重写了Listview的3个构造方法,然后用一个initview()方法来加载底部布局用布局构造器LayoutInflater类来实现,然后调用listview的addFooterView方法。开始时先将底部布局设置为隐藏,再在下拉时间中将其显示出来。我们来看代码 重写了listview的onScrollListener方法,监听事件里面有两个值得注意的方法

@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
if (totalItemCount == lastVisibieItem && scrollState == SCROLL_STATE_IDLE) {
if (!isLoading) {
isLoading = true;
footer.findViewById(R.id.footer_layout).setVisibility(View.VISIBLE);
// 加载更多(获取接口)
iLoadListener.onLoad();
}
}
}

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
this.lastVisibieItem = firstVisibleItem + visibleItemCount;
this.totalItemCount = totalItemCount;
}


先看onScroll()方法带有四个参数 根据名称很好看出参数的含义 view ,开始项,可见项的个数,总个数。我们定义一个lastVisibieItem = firstVisibleItem + visibleItemCount;等于开始项加可见项个数。来判断下拉是否到底了。if (totalItemCount == lastVisibieItem && scrollState == SCROLL_STATE_IDLE)当到底了,且停止滚动了。就加载底部布局。

因为改变ui不能再子线程中完成 所以我们,调用一个接口IloadListener 并在主线程中实现其的onLoad方法来加载底部布局。

listview类

public class ListviewItem {
private String name;
private int imageid;

public ListviewItem(String name, int imageid) {
super();
this.name = name;
this.imageid = imageid;
}

public String getName() {
return name;
}

public int getImageid() {
return imageid;
}

}


在ListViewTest中实现

public class ListViewTest extends Activity implements IloadListener {
private LoadListView listview;
private List<ListviewItem> listviewitems = new ArrayList<ListviewItem>();
private ItemAdapter adapter;
private int count = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listviewtest);
listview = (LoadListView) findViewById(R.id.listview);
adapter = new ItemAdapter(this, R.layout.listview_items, listviewitems);
listview.setAdapter(adapter);// 加载适配器
listview.setInterface(this);//将接口传进来
initItems();// 初始化数据

}

private void initItems() {
// TODO Auto-generated method stub
for(int i=0;i<15;i++){
ListviewItem listviewitem1 = new ListviewItem("初始化的"+i, R.drawable.ic_launcher);
listviewitems.add(listviewitem1);
}
}

// 获取更多数据 通知listview显示
@Override
public void onLoad() {
// 刷新太快 所以新启一个线程延迟两秒
Handler handler = new Handler();
handler.postDelayed(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 3; i++) {
ListviewItem listviewitem1 = new ListviewItem("加载的" + count, R.drawable.ic_launcher);
listviewitems.add(listviewitem1);
count++;

} // 通知listview加载完毕
listview.loadComplete();
}
}, 2000);
// TODO Auto-generated method stub

}

}


还有主布局listviewtest.xml

<LinearLayout 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"
android:orientation="vertical"
tools:context="com.example.demotest.MainActivity" >

<com.example.demotest.LoadListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</com.example.demotest.LoadListView>

</LinearLayout>


原文地址:http://blog.csdn.net/tangsilian/article/details/51200628
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android listview 分页
相关文章推荐