现在分页加载在apk中应用广泛 那么是怎么实现的呢 下面让我们举一个小例子来看一下
首先是我们的自定义的listview 在布局中引用 那么就看一下我们的布局文件
"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.muke.loadview.LoadListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
com.muke.loadview.LoadListView>
下面是我们自定义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.muke.view.R;
public class LoadListView extends ListView implements OnScrollListener{
private View footer;
int totalItemCount;//总的数量
int lastvisibleItem;//最后一个可见的item
boolean isLoading=false;
IloadListener iloadListener;
public LoadListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView(context);
}
public LoadListView(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public LoadListView(Context context) {
super(context);
initView(context);
}
/**
* 添加底部加载提示布局
* @param context
*/
private void initView(Context context){
LayoutInflater inflater = LayoutInflater.from(context);
footer = inflater.inflate(R.layout.footer, null);
footer.findViewById(R.id.line).setVisibility(View.GONE);
this.addFooterView(footer);//添加底部布局文件
//初始化时设置监听
this.setOnScrollListener(this);
}
/**
* 实现滚动监听的方法
*/
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//滚动到最低端并且是暂停状态
if (totalItemCount==lastvisibleItem&&scrollState==SCROLL_STATE_IDLE){
if (!isLoading) {
isLoading=true;
//设置底部文件可见
footer.findViewById(R.id.line).setVisibility(view.VISIBLE);
//加载更多
iloadListener.onLoad();
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
this.lastvisibleItem=firstVisibleItem+visibleItemCount;
this.totalItemCount=totalItemCount;
}
/**
* 加载完毕
*/
public void loadComplete(){
isLoading=false;
//设置底部文件不可见
footer.findViewById(R.id.line).setVisibility(View.GONE);
}
public void setInterFace(IloadListener iloadListener) {
this.iloadListener=iloadListener;
}
//加载更多数据的回调接口
public interface IloadListener{
public void onLoad();//方法是公开的不能是私有的
}
}
在自定义的view中需要添加我们的加载底部的布局文件 让我们一起看一下
<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/line"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:paddingTop="10dip"
android:paddingBottom="10dip"
android:gravity="center"
>
<ProgressBar
android:id="@+id/pb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="?android:attr/progressBarStyleSmall"
/>
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="正在加载。。。"
/>
LinearLayout>
LinearLayout>
下面展示的就是我们主类中的实现代码了 让我们一起见证一下吧
import java.util.ArrayList;
import java.util.List;
import com.muke.adapter.MyListAdapter;
import com.muke.loadview.LoadListView;
import com.muke.loadview.LoadListView.IloadListener;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
/**
* 实现思路
* 添加底部 布局
* 监听滚动事件 得到总的item项 最后可见的item 如果最后可见的item项等于总的item项 说明在界面最底端
* 加载数据 接口回调
* @author Administrator
*
*/
public class MainActivity extends Activity implements IloadListener {
private LoadListView lv;
private List list;
private MyListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (LoadListView) findViewById(R.id.lv);
lv.setInterFace(this);
addview();
}
private void addview() {
list = new ArrayList();
for (int i = 0; i < 20; i++) {
list.add("高薪就业" + i);
}
showListView(list);
}
private void addview1() {
for (int i = 0; i < 2; i++) {
list.add("相信自己就是奇迹" + i);
}
}
private void showListView(List list2) {
if (adapter == null) {
adapter = new MyListAdapter(MainActivity.this, list2);
lv.setAdapter(adapter);
} else {
adapter.notifyDataSetChanged();
}
}
@Override
public void onLoad() {
//我们实现一个加载延迟 但是在链接网络的情况下面是不需要的
Handler handler = new Handler() {
};
handler.postDelayed(new Runnable() {//延迟两秒
@Override
public void run() {
// 获取更过数据
addview1();//需要加载的布局
showListView(list);//通知适配器
lv.loadComplete();// 通知listview加载完毕
}
}, 2000);
}
}
最后将集合中的数据添加到适配器就可以了
下面看一下我们适配器中的实现代码
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;
import com.muke.view.R;
public class MyListAdapter extends BaseAdapter {
private Context context;
private List list;
private TextView tv;
public MyListAdapter(Context context, List list) {
super();
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) {
if (convertView==null) {
convertView=LayoutInflater.from(context).inflate(R.layout.item, null);
tv=(TextView) convertView.findViewById(R.id.text_item);
convertView.setTag(tv);
}else {
tv=(TextView) convertView.getTag();
}
tv.setText(list.get(position));
return convertView;
}
}
适配器中使用到布局文件 下面看一下我么item项的布局 就是一个textview 我还是把代码贴上了 看看这个你就会分页加载了 一定要有耐心哦
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/text_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="34dp"
android:layout_marginTop="18dp"
android:textSize="20sp"
android:text="TextView" />
RelativeLayout>
上面的是我们原先的数据 下面的是我们加载的数据 每一次加载两条