ListView下拉加载更多数据
1.创建footerView布局footer.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/footerLLayout"
android:layout_width="match_parent"
android:layout_height="60dp"
android:orientation="horizontal">
<ProgressBar
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"/>
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:text="加载更多"
android:gravity="center|left"
android:layout_weight="3"/>
</LinearLayout>
2.重写ListView,监听滚动状态,定义加载数据接口
public class FooterListView extends ListView implements AbsListView.OnScrollListener{
public FooterListView(Context context, AttributeSet attrs) {
super(context, attrs);
addFooterView();
}
public FooterListView(Context context) {
super(context);
addFooterView();
}
/**
* 重写ListView 添加FooterView
*/
private View footerView;
private void addFooterView(){
footerView=LayoutInflater.from(getContext()).inflate(R.layout.footer,null);
addFooterView(footerView);
footerView.setVisibility(View.GONE);//初始状态 footerView不显示
setOnScrollListener(this);
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//最后一个可见的Item id==item总数,已经滑动到底部了,并且停止滚动了,那么就加载数据
if(totalItemCount==firstVisibleItem+visibleItemCount && scrollState==SCROLL_STATE_IDLE){
if (iLoadListener!=null) {
footerView.setVisibility(View.VISIBLE);//加载数据 footerView显示
iLoadListener.loadData();//调用接口加载数据
}
}
Log.d(TAG,"onScrollStateChanged");
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
this.firstVisibleItem=firstVisibleItem;
this.visibleItemCount=visibleItemCount;
this.totalItemCount=totalItemCount;
Log.d(TAG,"onScroll");
}
//ListView的第一个Item,可见Item的总数,ListViewItem的总数
private int firstVisibleItem,visibleItemCount,totalItemCount;
private String TAG=FooterListView.class.getSimpleName();
//数据加载完成隐藏footerView
public void loadComplete(){
footerView.setVisibility(View.GONE);
}
//定义加载数据的接口
public interface ILoadListener{
void loadData();
}
private ILoadListener iLoadListener;
public void setiLoadListener(ILoadListener iLoadListener){
this.iLoadListener=iLoadListener;
}
}
3.创建ListAdapter布局item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="50dp">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textSize="16sp"/>
</LinearLayout>
4.定义ListAdapter
public class ListAdapter extends BaseAdapter {
private Context context;
private List<String> list;
public ListAdapter(Context context, List<String> list) {
this.context = context;
this.list = list;
}
@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) {
ViewHolder holder=null;
if(convertView==null){
convertView= LayoutInflater.from(context).inflate(R.layout.item,parent,false);
holder=new ViewHolder();
holder.tv=(TextView) convertView.findViewById(R.id.tv);
convertView.setTag(holder);
}else{
holder=(ViewHolder) convertView.getTag();
}
holder.tv.setText(list.get(position));
return convertView;
}
static class ViewHolder{
TextView tv;
}
}
5.在MainActivity中实现加载数据接口
public class MainActivity extends Activity implements FooterListView.ILoadListener {
private FooterListView listView;
private ListAdapter adapter;
private List<String> data=new ArrayList<String>();
{
data.add("第1条数据");
data.add("第2条数据");
data.add("第3条数据");
data.add("第4条数据");
data.add("第5条数据");
data.add("第6条数据");
data.add("第7条数据");
data.add("第11条数据");
data.add("第21条数据");
data.add("第31条数据");
data.add("第41条数据");
data.add("第51条数据");
data.add("第61条数据");
data.add("第71条数据");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=(FooterListView) findViewById(R.id.listView);
listView.setiLoadListener(this);
adapter=new ListAdapter(this,data);
listView.setAdapter(adapter);
}
@Override
public void loadData() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
data.add("新添加的数据1");
data.add("新添加的数据2");
adapter.notifyDataSetChanged();
listView.loadComplete();//加载完成
}
},10000);
}
}
6.MainActivity布局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"
tools:context="com.example.ruhu.listviewfooterloadmore.MainActivity">
<com.example.ruhu.listviewfooterloadmore.FooterListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</RelativeLayout>
7.运行结果
7.1初始状态
7.2正在加载
7.3加载完成