在网上有很多关于listView上拉加载的例子,由于前几天在看了这方面的视频,后来自己便开始写这个demo,顺便写入到博客中,希望大家多多评价,好了废话不多说直接上代码。
这个是Bean
package com.wcn.listviewloadmoredata;
public class ApkBean {
public String apkName = "";
}
下面是ListViewAdapter
package com.wcn.listviewloadmoredata;
import java.util.List;
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 ListViewAdapter extends BaseAdapter {
private List<ApkBean> apklist;
private LayoutInflater inflater;
public ListViewAdapter(Context context, List<ApkBean> apkBean) {
this.inflater = LayoutInflater.from(context);
this.apklist = apkBean;
}
public void setDateChange(List<ApkBean> apklist) {
this.apklist = apklist;
this.notifyDataSetChanged();
}
@Override
public int getCount() {
return apklist.size();
}
@Override
public Object getItem(int position) {
return apklist.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ApkBean apkBean = apklist.get(position);
ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.item_layout, parent, false);
holder.contentView = (TextView) convertView
.findViewById(R.id.context_text);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.contentView.setText(apkBean.apkName);
return convertView;
}
static class ViewHolder {
TextView contentView;
}
}
这个是ListViewLoad,listview中的回调接口在这里
package com.wcn.listviewloadmoredata;
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 ListViewLoad extends ListView implements OnScrollListener {
View footerView;
// 总数量
int totalItemCount;
// 最后一个可见的Item
int lastvisibleitem;
// 自定义加载的接口
private IListViewLoad ilistViewLoad;
// 是否在加载的标志位
boolean isLoading;
public ListViewLoad(Context context) {
super(context);
// 在构造方法中加载视图
initView(context);
}
public ListViewLoad(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// 在构造方法中加载视图
initView(context);
}
public ListViewLoad(Context context, AttributeSet attrs) {
super(context, attrs);
// 在构造方法中加载视图
initView(context);
}
//添加底部listview布局到视图中
private void initView(Context context) {
footerView = LayoutInflater.from(context).inflate(
R.layout.footer_layout, null);
// 初始化视图的时候将布局移除掉,防止一开始出现在视图中
footerView.findViewById(R.id.footer_lay).setVisibility(View.GONE);
// 向ListView中添加上拉加载布局
this.addFooterView(footerView);
// ListView设置滑动监听
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) {
// 如果总数量等于最后一个item且手在向下滚动时,显示加载布局,且加载更多内容
if (totalItemCount == lastvisibleitem
&& scrollState == SCROLL_STATE_IDLE) {
// 显示
footerView.findViewById(R.id.footer_lay)
.setVisibility(View.VISIBLE);
if (!isLoading) {
isLoading = true;
// 加载更多
ilistViewLoad.onLoad();
}
}
}
//加载完毕
public void loadComplete(){
isLoading = false;
footerView.findViewById(R.id.footer_lay)
.setVisibility(View.GONE);
}
//将接口设置进去
public void setInterface(IListViewLoad ilistViewLoad){
this.ilistViewLoad = ilistViewLoad;
}
public interface IListViewLoad{
public void onLoad();
}
}
下面mianActivity
package com.wcn.listviewloadmoredata;
import java.util.ArrayList;
import java.util.List;
import com.wcn.listviewloadmoredata.ListViewLoad.IListViewLoad;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
public class MainActivity extends Activity implements IListViewLoad {
private List<ApkBean> apkList = new ArrayList<ApkBean>();
private ListViewAdapter adapter;
private ListViewLoad listViewLoad;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getDate();
showListView(apkList);
}
private void showListView(List<ApkBean> apkList) {
if (adapter == null) {
listViewLoad = (ListViewLoad) findViewById(R.id.listview);
// 设置回调接口
listViewLoad.setInterface(this);
adapter = new ListViewAdapter(this, apkList);
listViewLoad.setAdapter(adapter);
} else {
adapter.setDateChange(apkList);
}
}
private void getDate() {
for (int i = 0; i < 10; i++) {
ApkBean apkBean = new ApkBean();
apkBean.apkName = "三国杀";
apkBean.apkName = "截杀";
apkList.add(apkBean);
}
}
// 加载更多的数据
private void getMoreDate() {
for (int i = 0; i < 10; i++) {
ApkBean apkBean = new ApkBean();
apkBean.apkName = "通杀";
apkList.add(apkBean);
}
}
// 加载更多数据的逻辑在这里
@Override
public void onLoad() {
// 通过开启一个子线程加载更过的数据
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
// 加载数据
getMoreDate();
// 显示
showListView(apkList);
// 通知listview加载完毕
listViewLoad.loadComplete();
}
}, 3000);
}
}
以下是相关的布局
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.wcn.listviewloadmoredata.ListViewLoad
android:id="@+id/listview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="#FFFFFF"
android:cacheColorHint="#00000000"
android:dividerHeight="5dip" />
</RelativeLayout>
下面是footer_layout.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" >
<LinearLayout
android:id="@+id/footer_lay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal" >
<ProgressBar
android:id="@+id/progressBar1"
style="?android:attr/progressBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="加载更多..." />
</LinearLayout>
</LinearLayout>
下面是item_layout.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" >
<LinearLayout
android:id="@+id/footer_lay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal" >
<ImageView
android:id="@+id/icon_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/context_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="内容" />
</LinearLayout>
</LinearLayout>
最后就是
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.wcn.listviewloadmoredata"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="17"
android:targetSdkVersion="21" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
到这里所有的代码都贴出来了
欢迎吐槽,指教