ListView分页下载

实现ListView的OnScrollListener接口,监听它的滚动。

在其中的一个方法onScroll,我们可以获得到当前第一个可见item的编号以及当前有多少个可见item(关心最后一个可见的条目)和总共有多少个item。这样子我们就可以轻易由计算得出是否滚动带最底部了。

然后在onSrollStateChanged方法中做判断,如果滚动到最底部,就显示出正在加载数据的进度条,并完成数据的加载。

但是有一个问题是,加载的数据在MainActivity里面,我们怎么在MyListView中获得加载的数据?这就要使用接口回调,我们在MyListView中设定一个回调接口,然后在MainAcivty中回调,就可以实现MyListView获得加载的数据。

 转载自https://www.cnblogs.com/fuly550871915/p/4866985.html

package com.fuly.load;

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 MyListView extends ListView implements OnScrollListener{
    
     private int lastVisibleItem;//最后一个可见的item
    
     private int totalItemCount;//总的item
     
     private boolean isLoading = false;//是否正在加载数据
     
     private ILoadListener mListener;//回调接口,用来加载数据
     
     private View footer;//底布局
     

    //注意,三个构造方法都要重写
    public MyListView(Context context) {
        super(context);
        initView(context);
        
    }
    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView(context);
    }
    public MyListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initView(context);
    }
    
    
    //定义一个回调接口,用来获得要加载的数据
    public interface ILoadListener{
        void loadData();
    }
    
    public void setOnILoadListener(ILoadListener listener){
         
        this.mListener = listener;
    }
    
    
    
    //初始化view
    private void initView(Context context){
        
       footer = LayoutInflater.from(context).inflate(R.layout.footer, null);
    
        //注意,这句代码的意思是给自定义的ListView加上底布局
        this.addFooterView(footer);
        
        //首先需要隐藏这个底部布局
        footer.findViewById(R.id.load_layout).setVisibility(View.GONE);
        
        this.setOnScrollListener(this);//千万别忘记设定监听器
        
    }
    
    
    
    //加载数据完成后,需要执行的操作
    public void loadFinish(){
        
        isLoading = false;//不再加载了
        //底布局也要隐藏
        footer.findViewById(R.id.load_layout).setVisibility(View.GONE);
        
    }
    
    
    //参数scrollState表示滑动的状态
    public void onScrollStateChanged(AbsListView view, int scrollState) {
       
        //如果最后一个可见item等于总的item,且当前滚动状态为滚动停止,就应该开始加加载数据了
        if(lastVisibleItem == totalItemCount && scrollState==SCROLL_STATE_IDLE){
            
            if(!isLoading){
                isLoading = true;
                
                //加载数据
                mListener.loadData();
                //设置底布局可见
                footer.findViewById(R.id.load_layout).setVisibility(View.VISIBLE);
            }
        }
        
    }
    
    /***
     * 该方法用来监听实时滚动中的item
     * firstVisibleItem:当前第一个可见的item
     * visibleItemCount:当前总共有多少个可见的item
     * totalItemCount:总的item
     */
    public void onScroll(AbsListView view, int firstVisibleItem,
            int visibleItemCount, int totalItemCount) {
        
        this.lastVisibleItem = firstVisibleItem + visibleItemCount;
        this.totalItemCount = totalItemCount;
        
    }
    
    

}

猜你喜欢

转载自blog.csdn.net/hd12370/article/details/82754924