一、建立底部的布局文件
<?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/load_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:paddingBottom="10dip"
android:paddingTop="10dip" >
<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>
继承listView
package com.imooc.view;
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;
import com.imooc.load.R;
public class LoadListView extends ListView implements OnScrollListener {
View footer;// 底部布局;
int totalItemCount;// 总数量;
int lastVisibleItem;// 最后一个可见的item;
boolean isLoading;// 正在加载;
ILoadListener iLoadListener;
public LoadListView(Context context) {
super(context);
// TODO Auto-generated constructor stub
initView(context);
}
public LoadListView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
initView(context);
}
public LoadListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
initView(context);
}
/**
* 添加底部加载提示布局到listview
*
* @param context
*/
private void initView(Context context) {
LayoutInflater inflater = LayoutInflater.from(context);
footer = inflater.inflate(R.layout.footer_layout, null);
footer.findViewById(R.id.load_layout).setVisibility(View.GONE);
this.addFooterView(footer);
this.setOnScrollListener(this);//设置滚动监听
}
//firstVisibleItem第一个可见item的位置,visibleItemCount可见item的数量,totalItemCount item的总数量
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
this.lastVisibleItem = firstVisibleItem + visibleItemCount;//最后一个可见item的位置
this.totalItemCount = totalItemCount;
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
// 可见item数量等于总数量且停止滚动时,为已到底部
if (totalItemCount == lastVisibleItem
&& scrollState == SCROLL_STATE_IDLE) {
if (!isLoading) {
isLoading = true;
footer.findViewById(R.id.load_layout).setVisibility(
View.VISIBLE);
// 加载更多
iLoadListener.onLoad();
}
}
}
/**
* 加载完毕
*/
public void loadComplete(){
isLoading = false;
footer.findViewById(R.id.load_layout).setVisibility(
View.GONE);
}
public void setInterface(ILoadListener iLoadListener){
this.iLoadListener = iLoadListener;
}
//加载更多数据的回调接口
public interface ILoadListener{
public void onLoad();
}
}
实体类
package com.imooc.entity;
public class ApkEntity {
private String name;
private String des;
private String info;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
adapter实现
package com.imooc.adapter;
import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.imooc.entity.ApkEntity;
import com.imooc.load.R;
public class MyAdapter extends BaseAdapter {
ArrayList<ApkEntity> apk_list;
LayoutInflater inflater;
public MyAdapter(Context context, ArrayList<ApkEntity> apk_list) {
this.apk_list = apk_list;
this.inflater = LayoutInflater.from(context);
}
//新增数据时通知更新listview的UI
public void onDateChange(ArrayList<ApkEntity> apk_list) {
this.apk_list = apk_list;
this.notifyDataSetChanged();
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return apk_list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return apk_list.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ApkEntity entity = apk_list.get(position);
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.item_layout, null);
holder.name_tv = (TextView) convertView
.findViewById(R.id.item3_apkname);
holder.des_tv = (TextView) convertView
.findViewById(R.id.item3_apkdes);
holder.info_tv = (TextView) convertView
.findViewById(R.id.item3_apkinfo);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
holder.name_tv.setText(entity.getName());
holder.des_tv.setText(entity.getDes());
holder.info_tv.setText(entity.getInfo());
return convertView;
}
class ViewHolder {
TextView name_tv;
TextView des_tv;
TextView info_tv;
}
}
package com.imooc.load;
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import com.imooc.adapter.MyAdapter;
import com.imooc.entity.ApkEntity;
import com.imooc.view.LoadListView;
import com.imooc.view.LoadListView.ILoadListener;
public class MainActivity extends Activity implements ILoadListener{
ArrayList<ApkEntity> apk_list = new ArrayList<ApkEntity>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getData();
showListView(apk_list);
}
MyAdapter adapter;
LoadListView listview;
private void showListView(ArrayList<ApkEntity> apk_list) {
if (adapter == null) {
listview = (LoadListView) findViewById(R.id.listview);
listview.setInterface(this);
adapter = new MyAdapter(this, apk_list);
listview.setAdapter(adapter);
} else {
adapter.onDateChange(apk_list);
}
}
private void getData() {
for (int i = 0; i < 10; i++) {
ApkEntity entity = new ApkEntity();
entity.setName("测试程序");
entity.setInfo("50w用户");
entity.setDes("这是一个神奇的应用!");
apk_list.add(entity);
}
}
private void getLoadData() {
for (int i = 0; i < 2; i++) {
ApkEntity entity = new ApkEntity();
entity.setName("更多程序");
entity.setInfo("50w用户");
entity.setDes("这是一个神奇的应用!");
apk_list.add(entity);
}
}
//正常情况下不用使用handler,直接更新UI即可
@Override
public void onLoad() {
// TODO Auto-generated method stub
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
//获取更多数据
getLoadData();
//更新listview显示;
showListView(apk_list);
//通知listview加载完毕,隐藏加载的布局
listview.loadComplete();
}
}, 2000);
}
}
listview 下拉刷新实例
新建头部的布局文件header_layout.xml
<?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="wrap_content"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="10dip"
android:paddingTop="10dip" >
<LinearLayout
android:id="@+id/layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center"
android:orientation="vertical" >
<TextView
android:id="@+id/tip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下拉可以刷新!" />
<TextView
android:id="@+id/lastupdate_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<ImageView
android:id="@+id/arrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/layout"
android:layout_marginRight="20dip"
android:src="@drawable/pull_to_refresh_arrow" />
<ProgressBar
android:id="@+id/progress"
style="?android:attr/progressBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/layout"
android:layout_marginRight="20dip"
android:visibility="gone" />
</RelativeLayout>
</LinearLayout>
将布局文件添加到listview中,继承listview