分页加载

现在分页加载在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>

辛苦了这么半天 让我们看一下我们的效果吧
分页加载_第1张图片

上面的是我们原先的数据 下面的是我们加载的数据 每一次加载两条

你可能感兴趣的:(分页加载)