listView实现分页加载

实现简单的listview分页加载,效果如下图所示:
这里写图片描述
ListView显示预加载的10个Item,往上拉动每次加载2个Item;
自定义类LoadListView继承ListView,实现OnScrollListener接口,重写它的两个方法,在类里面定义一个加载更多数据的回调接口;

public class LoadListView extends ListView implements OnScrollListener
{
    View footer;         //底部布局;
    int lastVisibleItem; //最后一个可见的item;
    int totalItemCount;  //总的数量;
    boolean isLoading;   //正在加载;
    ILoadListener iLoadListener;

    public LoadListView(Context context) 
    {
        super(context);
        initShow(context);
    }

    public LoadListView(Context context, AttributeSet attrs) 
    {
        super(context, attrs);
        initShow(context);
    }

    //加载底部布局;
    private void initShow(Context context)
    {
        LayoutInflater inflater = LayoutInflater.from(context);
        footer = inflater.inflate(R.layout.footer_layout, null);
        footer.findViewById(R.id.layout).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.layout).
                   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 setLoadListener(ILoadListener iLoadListener)
    {
        this.iLoadListener = iLoadListener;
    }

    //加载完成;
    public void setComplete()
    {
        isLoading = false;
        footer.findViewById(R.id.layout).
            setVisibility(View.GONE);
    }   

    //加载更多数据的回调接口;
    public interface ILoadListener
    {
        public void onload();
    }
}

footer_layout布局文件:

<?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/layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" 
        android:paddingTop="10dp"
        android:paddingBottom="10dp"
        android:gravity="center"
        >
        <ProgressBar 
            style="?android:attr/progressBarStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />
        <TextView
            android:text="正在加载……"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />

    </LinearLayout>
</LinearLayout>

MainActivity中实现LoadListView中的ILoadListener接口:

public class MainActivity extends Activity implements ILoadListener
{
    MyAdapterTel myAdapter;
    LoadListView listView;
    List<TelContent> list = new ArrayList<TelContent>();          //店铺集合;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getData();           //预加载的数据;
        showListView(list);  //显示预加载的数据;
    }

    private void showListView(List<TelContent> list)
    {
        if(myAdapter == null)
        {
            listView = (LoadListView)findViewById(R.id.filemgr_all_listView);
            listView.setLoadListener(this);  //设置接口监听;
            myAdapter = new MyAdapterTel(this, list);
            listView.setAdapter(myAdapter);
        }
        else
        {
            myAdapter.onDateChange(list);
        }
    }

    //预加载的数据;
    private void getData()
    {
        for(int i=0; i<10; i++)
        {
            TelContent telContent = new TelContent();
            telContent.setId(i);
            telContent.setShop("aaa" + i);
            telContent.setTel("7777" + i);
            list.add(telContent);
            list.get(i).toString();
        }
    }

    //每次加载的数据;
    private void getLoadData()
    {
        for(int i=0; i<2; i++)
        {
            TelContent telContent = new TelContent();
            telContent.setId(i);
            telContent.setShop("aaa" + i);
            telContent.setTel("7777" + i);
            list.add(telContent);
        }
    }

    @Override
    public void onload() 
    {
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() //方便显示加载数据的效果,延时2000mm执行;
        {       
            @Override
            public void run() 
            {               
                getLoadData();       //加载数据;                
                showListView(list);  //更新listView界面;                
                listView.setComplete();//隐藏footer;
            }
        }, 2000); 
    }
}

TelContent封装类:

package com.lu.list;

public class TelContent 
{
    private String shop;  //店铺名;
    private String tel;   //店铺电话;   
    private Integer id;   //通讯种类;

    public String getShop() {
        return shop;
    }
    public void setShop(String shop) {
        this.shop = shop;
    }
    public String getTel() {
        return tel;
    }
    public void setTel(String tel) {
        this.tel = tel;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    } 
    @Override
    public String toString() 
    {
        return "id=" + id + ", shop=" + shop + ", tel=" + tel;
    }
}

Adapter适配器:

package com.lu.list;

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 MyAdapterTel extends BaseAdapter
{
    TextView telmgr_tel_tv;       //电话;
    TextView telmgr_title_tv;     //店铺;
    List<TelContent> list;        //店铺集合;
    LayoutInflater inflater;

    public MyAdapterTel(Context context, List<TelContent> listTel)
    {
        inflater = LayoutInflater.from(context);
        this.list = listTel;
    }

    //数据刷新;
    public void onDateChange(List<TelContent> listTel)
    {
        this.list = listTel;
        this.notifyDataSetChanged();
    }

    @Override
    public int getCount() 
    {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {
        convertView = inflater.inflate(R.layout.items_layout, null);
        telmgr_title_tv = (TextView)convertView.findViewById(R.id.telmgr_title_tv);
        telmgr_tel_tv = (TextView)convertView.findViewById(R.id.telmgr_tel_tv);
        telmgr_title_tv.setText(list.get(position).getShop());
        telmgr_tel_tv.setText(list.get(position).getTel());
        return convertView;
    }
}

items_layout列表布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <TextView 
       android:id="@+id/telmgr_title_tv"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:textSize="17sp"
       android:padding="9dp"
       android:layout_alignParentLeft="true"
       />

    <TextView
        android:id="@+id/telmgr_tel_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:textSize="17sp"
        android:padding="9dp"
        />

</RelativeLayout>

listView分页下载的源码http://download.youkuaiyun.com/detail/baidu_32731497/9453685

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值