ListView的滾動(dòng)監(jiān)聽(tīng)--AbsListView.OnScrollListener的學(xué)習(xí)

1、知識(shí)點(diǎn)

1、 onScrollStateChanged

@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {}

scrollState有三種狀態(tài):

  • SCROLL_STATE_TOUCH_SCROLL:開(kāi)始滾動(dòng)的時(shí)候調(diào)用,調(diào)用一次
  • SCROLL_STATE_IDLE:滾動(dòng)事件結(jié)束的時(shí)候調(diào)用,調(diào)用一次
  • SCROLL_STATE_FLING:當(dāng)手指離開(kāi)屏幕,并且產(chǎn)生慣性滑動(dòng)的時(shí)候調(diào)用,可能會(huì)調(diào)用<=1次

在沒(méi)有做出拋的動(dòng)作時(shí),只會(huì)回調(diào)兩次

2、 onScroll

@Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {}

在滑動(dòng)屏幕的過(guò)程中,onScroll方法會(huì)一直調(diào)用:

  • firstVisibleItem: 當(dāng)前屏幕顯示的第一個(gè)item的位置(下標(biāo)從0開(kāi)始)
  • visibleItemCount:當(dāng)前屏幕可以見(jiàn)到的item總數(shù),包括沒(méi)有完整顯示的item
  • totalItemCount:Item的總數(shù),** 包括通過(guò)addFooterView添加的那個(gè)item **

** 注意:
在listview的item發(fā)生變化的時(shí)候(初始化/notifyDataSetChanged()),onScroll會(huì)被調(diào)用:


初始化listview的時(shí)候,onScroll發(fā)生調(diào)用

**

2、 加載更多

在onScroll這個(gè)方法中,可以通過(guò)以上幾個(gè)參數(shù),判斷是否是最后一個(gè)item,可以實(shí)現(xiàn)加載更多的功能

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        if(firstVisibleItem+visibleItemCount>=totalItemCount && totalItemCount>0){
            isLastRow=true;
        }else {
            isLastRow=false;
        }
    }

** ListView的上拉下拉的功能可以通過(guò)SwipeRefreshLayout+自定義ListView(OnScrollListener)實(shí)現(xiàn) **,
見(jiàn),SwipeRefreshLayout的學(xué)習(xí)

代碼如下:

package com.liyi.loadmorelistview;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListView;
import android.widget.TextView;

public class LoadMoreListView extends ListView implements AbsListView.OnScrollListener {

    private Context context;
    private View footerView;
    private boolean isLastRow;
    private boolean isLoading;
    private boolean isError;
    private OnLoadMoreListener loadMoreListener;

    public void setOnLoadMoreListener(OnLoadMoreListener loadMoreListener){
        this.loadMoreListener=loadMoreListener;
    }

    public  interface OnLoadMoreListener{
        void loadMore();
    }

    public LoadMoreListView(Context context) {
        this(context,null);
    }

    public LoadMoreListView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public LoadMoreListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.context=context;
        init();
    }

    private void init() {
        footerView= LayoutInflater.from(context).inflate(R.layout.layout_footer,this,false);
        this.addFooterView(footerView);
        ( (footerView.findViewById(R.id.footerTextView))).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if(isError){
                    showLoading("正在加載");
                    isLoading=true;
                    loadMoreListener.loadMore();
                    isError=false;
                }
            }
        });
        setOnScrollListener(this);
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        Log.i("loadMore","onScrollStateChanged:"+scrollState+",isLastRow"+isLastRow);
        if(scrollState==SCROLL_STATE_IDLE){
            if(isLastRow && !isLoading){
                showLoading("正在加載");
                isLoading=true;
                loadMoreListener.loadMore();
            }
        }
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        Log.i("loadMore","onScroll"+"firstVisibleItem:"+firstVisibleItem+",visibleItemCount:"+visibleItemCount+",totalItemCount:"+totalItemCount);
        if(firstVisibleItem+visibleItemCount>=totalItemCount && totalItemCount>0){
            isLastRow=true;
        }else {
            isLastRow=false;
        }
    }

    private void showLoading(String msg) {
        footerView.findViewById(R.id.progressBar).setVisibility(View.VISIBLE);
        ((TextView) (footerView.findViewById(R.id.footerTextView))) .setText(msg);
    }

    private void hiddenLoading(String msg) {
        footerView.findViewById(R.id.progressBar).setVisibility(View.GONE);
        ((TextView) (footerView.findViewById(R.id.footerTextView))) .setText(msg);
    }

    public void loadComplete(){
        Log.i("loadMore","loadComplete"+",isLastRow"+isLastRow);
        isError=false;
        isLoading=false;
        isLastRow=false;
        hiddenLoading("-- end --");
    }

    public void loadError(){
        isLoading=false;
        isError=true;
        hiddenLoading("加載失敗,點(diǎn)擊重新加載");

    }

}


正在 加載
加載失敗
沒(méi)有數(shù)據(jù)了

代碼 下載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容