先看下目录结构
实现效果
创建TitleBean.java
public class TitleBean {
int imgId;
String content;
public int getImgId () {
return imgId;
}
public void setImgId (int imgId) {
this .imgId = imgId;
}
public String getContent () {
return content;
}
public void setContent (String content) {
this .content = content;
}
@Override
public String toString () {
return "TitleBean{" +
"imgId=" + imgId +
", content='" + content + '\'' +
'}' ;
}
}
MyAdapter.java
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
/**
* Created by Administrator on 2016/5/28.
*/
public class MyBaseAdapter extends BaseAdapter {
private ArrayList <TitleBean>list;
private Context context;
public MyBaseAdapter (ArrayList<TitleBean> list,Context context) {
this .list = list;
this .context=context;
}
public void onDateChange (ArrayList<TitleBean> list) {
this .list = list;
this .notifyDataSetChanged();
}
@Override
public int getCount () {
return list.size();
}
@Override
public Object getItem (int position) {
return list.get(position);
}
@Override
public long getItemId (int position) {
return position;
}
@Override
public View getView (int position, View convertView, ViewGroup parent) {
TitleBean bean= (TitleBean) getItem(position);
ViewHoder hoder;
View view=null ;
if (convertView==null ){
view= LayoutInflater.from(context).inflate(R.layout.item,null );
hoder=new ViewHoder();
hoder.TitleimgId= (ImageView) view.findViewById(R.id.img);
hoder.Titlecontent= (TextView) view.findViewById(R.id.et_content);
view.setTag(hoder);
}else {
view=convertView;
hoder= (ViewHoder) view.getTag();
}
hoder.TitleimgId.setImageResource(bean.getImgId());
hoder.Titlecontent.setText(bean.getContent());
return view;
}
private class ViewHoder {
ImageView TitleimgId;
TextView Titlecontent;
}
}
MyListView.java
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListView;
/**
* Created by Administrator on 2016/5/28.
*/
public class LoadListView extends ListView implements ListView .OnScrollListener {
View footer;
int totalItemCount;
int lastVisibleItem;
boolean isLoading;
ILoadListener iLoadListener;
public LoadListView (Context context) {
super (context);
initView(context);
}
public LoadListView (Context context, AttributeSet attrs) {
super (context, attrs);
initView(context);
}
public LoadListView (Context context, AttributeSet attrs, int defStyle) {
super (context, attrs, defStyle);
initView(context);
}
/**
* 添加底部加载提示布局到listview
*
* @param context
*/
private void initView (Context context) {
LayoutInflater inflater = LayoutInflater.from(context);
footer = inflater.inflate(R.layout.load_more, null );
footer.findViewById(R.id.load_layout).setVisibility(View.GONE);
this .addFooterView(footer);
this .setOnScrollListener(this );
}
@Override
public void onScroll (AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
this .lastVisibleItem = firstVisibleItem + visibleItemCount;
this .totalItemCount = totalItemCount;
}
@Override
public void onScrollStateChanged (AbsListView view, int scrollState) {
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 {
void onLoad();
}
}
MainActivity.java
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements LoadListView .ILoadListener {
private LoadListView mListView;
private ArrayList list = new ArrayList();
MyBaseAdapter adapter;
private int [] titleArr = new int []{R.mipmap.ic_launcher
, R.mipmap.ic_launcher, R.mipmap.ic_launcher
, R.mipmap.ic_launcher, R.mipmap.ic_launcher
, R.mipmap.ic_launcher, R.mipmap.ic_launcher
, R.mipmap.ic_launcher, R.mipmap.ic_launcher
, R.mipmap.ic_launcher, R.mipmap.ic_launcher
, R.mipmap.ic_launcher, R.mipmap.ic_launcher
, R.mipmap.ic_launcher, R.mipmap.ic_launcher
, R.mipmap.ic_launcher, R.mipmap.ic_launcher
, R.mipmap.ic_launcher, R.mipmap.ic_launcher
, R.mipmap.ic_launcher, R.mipmap.ic_launcher
};
@Override
protected void onCreate (Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (LoadListView) findViewById(R.id.lv);
loadData();
showListView(list);
}
private void showListView (ArrayList<TitleBean> list) {
if (adapter == null ) {
mListView = (LoadListView) findViewById(R.id.lv);
mListView.setInterface(this );
adapter = new MyBaseAdapter(list, this );
mListView.setAdapter(adapter);
} else {
adapter.onDateChange(list);
}
}
public void loadData () {
for (int i = 0 ; i < titleArr.length; i++) {
TitleBean bean = new TitleBean();
bean.setImgId(titleArr[i]);
bean.setContent("i am " + i + " content" );
list.add(bean);
}
}
public void loadMoreData () {
for (int i = 0 ; i < 10 ; i++) {
TitleBean bean = new TitleBean();
bean.setImgId(titleArr[i]);
bean.setContent("i am " + "new content" );
list.add(bean);
}
}
@Override
public void onLoad () {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run () {
loadMoreData();
showListView(list);
mListView.loadComplete();
}
}, 2000 );
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<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"
android:paddingBottom ="@dimen/activity_vertical_margin"
android:paddingLeft ="@dimen/activity_horizontal_margin"
android:paddingRight ="@dimen/activity_horizontal_margin"
android:paddingTop ="@dimen/activity_vertical_margin"
tools:context ="com.example.edu.listviewtest.MainActivity" >
<com.example.edu.listviewtest.LoadListView
android:layout_width ="match_parent"
android:layout_height ="match_parent"
android:id ="@+id/lv" >
</com.example.edu.listviewtest.LoadListView >
</RelativeLayout >
item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"
android:orientation ="horizontal" android:layout_width ="match_parent"
android:layout_height ="match_parent" >
<ImageView
android:id ="@+id/img"
android:src ="@mipmap/ic_launcher"
android:layout_width ="50dp"
android:layout_height ="50dp" />
<TextView
android:id ="@+id/et_content"
android:gravity ="center_horizontal"
android:textSize ="20sp"
android:text ="aaaaa"
android:layout_width ="match_parent"
android:layout_height ="50dp" />
</LinearLayout >
load_more.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" >
<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 >