效果图:
布局文件
/LoadListView/res/layout/activity_main.xml
<RelativeLayout 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"
>
<com.example.loadlistview.LoadListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/list"
/>
</RelativeLayout>
/LoadListView/res/layout/item.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="match_parent"
android:orientation="vertical"
android:paddingTop="10dp" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="60dip"
android:layout_marginLeft="2dip"
android:layout_marginTop="9dip"
android:background="@drawable/border_work"
android:orientation="horizontal" >
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.8" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_marginRight="2dip"
android:gravity="center_vertical"
android:orientation="vertical" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/t1" />
</LinearLayout>
<LinearLayout
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal" >
<TextView
android:id="@+id/tv_log_title"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="接中国来的客人"
android:textSize="16sp" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginRight="10dp"
android:src="@drawable/alarm" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal" >
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="2015.03.06"
android:textSize="16sp" />
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical"
android:text="08:00"
android:textSize="16sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<ImageView
android:id="@+id/image_by"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/bycar" />
</RelativeLayout>
</LinearLayout>
/LoadListView/res/layout/footer.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="horizontal"
android:gravity="center"
android:id="@+id/footer"
android:paddingTop="10dp"
android:paddingBottom="10dp">
<ProgressBar android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="?android:attr/progressDrawable"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:text="正在加载"
/>
</LinearLayout>
com.example.loadlistview.LoadListView
package com.example.loadlistview;
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 LoadListView extends ListView implements OnScrollListener{
private View footer;
private int totalItemCount;
private int lastVisibleItem;
private boolean isLoading;//正在加载
private ILoadMoreDateListener loadMoreDateListener;
public LoadListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView(context);
}
public LoadListView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public LoadListView(Context context) {
this(context,null);
}
private void initView(Context context) {
footer=LayoutInflater.from(context).inflate(R.layout.footer, null);
footer.findViewById(R.id.footer).setVisibility(View.GONE);
this.addFooterView(footer);
setOnScrollListener(this);
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (lastVisibleItem==totalItemCount&&scrollState==SCROLL_STATE_IDLE) {
if (!isLoading) {
isLoading=true;
footer.findViewById(R.id.footer).setVisibility(View.VISIBLE);
//加载更多数据
loadMoreDateListener.onLoad();
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
this.lastVisibleItem=firstVisibleItem+visibleItemCount;
this.totalItemCount=totalItemCount;
}
public void setOnILoadMoreDateListener(ILoadMoreDateListener iLoadMoreDateListener){
this.loadMoreDateListener=iLoadMoreDateListener;
}
/**
* 通知加载完毕
*/
public void loadComplete(){
isLoading=false;
footer.findViewById(R.id.footer).setVisibility(View.GONE);
}
/**加载更多数据的回调接口
* @author Administrator
*
*/
public interface ILoadMoreDateListener{
public void onLoad();
}
}
com.example.loadlistview.MainActivity
package com.example.loadlistview;
import java.util.ArrayList;
import java.util.List;
import com.example.loadlistview.LoadListView.ILoadMoreDateListener;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity implements ILoadMoreDateListener{
private LoadListView listView;
private TextView textView;
private ListAdapter adapter;
private List<String> date_list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initDate();
showListViewData();
}
/**
* 初始化模拟数据
*/
private void initDate(){
date_list=new ArrayList<String>();
for (int i = 0; i < 20; i++) {
date_list.add("listItem "+i);
}
}
/**
* 加载模拟数据
*/
private void getDate(){
for (int i = 0; i < 2; i++) {
date_list.add("listItem again "+i);
}
}
private void showListViewData(){
if (adapter==null) {
listView=(LoadListView) findViewById(R.id.list);
listView.setOnILoadMoreDateListener(this);
adapter=new ListAdapter(date_list, this);
listView.setAdapter(adapter);
}else {
adapter.onDateChange(date_list);
}
}
@Override
public void onLoad() {
//handler在实际项目中是不需要的,这里是为了演示请求数据的过程
Handler handler=new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
getDate();
showListViewData();
listView.loadComplete();
}
}, 2000);
}
}
com.example.loadlistview.ListAdapter
package com.example.loadlistview;
import java.util.List;
import javax.security.auth.PrivateCredentialPermission;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class ListAdapter extends BaseAdapter{
private List<String> data_list;
private Context context;
public ListAdapter(List<String> data_list, Context context) {
super();
this.data_list = data_list;
this.context = context;
}
@Override
public int getCount() {
return data_list==null?0:data_list.size();
}
@Override
public Object getItem(int position) {
return data_list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder=null;
if (convertView==null) {
holder=new ViewHolder();
convertView=LayoutInflater.from(context).inflate(R.layout.item, null);
holder.textView=(TextView) convertView.findViewById(R.id.tv_log_title);
convertView.setTag(holder);
}else {
holder=(ViewHolder) convertView.getTag();
}
holder.textView.setText(data_list.get(position));
return convertView;
}
class ViewHolder{
private TextView textView;
}
public void onDateChange(List<String> date_list) {
this.data_list=date_list;
this.notifyDataSetChanged();
}
}
源码:http://download.csdn.net/detail/gly742279097/8591331