美文网首页
Android实践 | ListView简单封装,实现上拉加载

Android实践 | ListView简单封装,实现上拉加载

作者: CCCode1997 | 来源:发表于2019-04-08 21:59 被阅读0次

    简单封装,因此代码逻辑很简单,直接结合注释看代码:

    import android.content.Context;
    import android.util.AttributeSet;
    import android.view.View;
    import android.widget.AbsListView;
    import android.widget.ListView;
    
    import com.laughter.framework.OnLoadMoreListener;
    
    public class LoadingListView extends ListView implements AbsListView.OnScrollListener {
    
        //item总数
        private int mTotalItemCount;
        // 是否正在加载
        private boolean isLoading;
        // 加载接口 
        private OnLoadMoreListener mLoadingListener;
    
        // FooterView 需要通过 addFooterView(View v) 方法添加进来
        private View mLoadingView;
    
        public LoadingListView(Context context) {
            this(context, null);
        }
    
        public LoadingListView(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        public LoadingListView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init();
        }
    
        private void init() {
            // 取消滑动到边界的弧形阴影
            setOverScrollMode(OVER_SCROLL_NEVER);
            // 设置滑动监听
            setOnScrollListener(this);
        }
    
        // 设置自定义接口 OnLoadMoreListener
        public void setOnLoadMoreListener(OnLoadMoreListener listener){
            this.mLoadingListener = listener;
        }
    
        /**
         * 数据加载完成后,调用此方法
         * 将正在加载标记置为 false
         * 并且将 FooterView 移除掉
         */
        public void setLoadCompleted() {
            isLoading = false;
            removeFooterView(mLoadingView);
        }
    
        @Override
        public void onScrollStateChanged(AbsListView listView, int scrollState) {
            // 获取最后一个可见item的 position
            int lastVisibleIndex = listView.getLastVisiblePosition();
            // 如果当前未加载,并且滚动停止,并且最后一个可见item是当前list的最后一个
            if (!isLoading && scrollState == SCROLL_STATE_IDLE && lastVisibleIndex == mTotalItemCount-1){
                isLoading = true;
                // 显示LoadingView ,并且回调 onLoadMore() 方法
                addFooterView(mLoadingView);
                if (mLoadingListener != null){
                    mLoadingListener.onLoadMore();
                }
            }
        }
    
        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            mTotalItemCount = totalItemCount;
        }
    
        @Override
        public void addFooterView(View v) {
            mLoadingView = v;
            super.addFooterView(mLoadingView);
        }
    }
    

    下面是 OnLoadMoreListener 接口

    public interface OnLoadMoreListener {
        public void onLoadMore();
    }
    

    使用也很简单,先看布局文件:

        <com.laughter.framework.views.LoadingListView
            android:id="@+id/llv_collection"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
        public void initView() {    
            mListView.addFooterView(LayoutInflater.from(this)
                          .inflate(R.layout.layout_footer_view, mListView, false));
            mListView.setOnLoadMoreListener(this);
        }
    
        @Override
        public void onLoadMore() {
              // 这里可以进行网络请求,数据加载完成后,调用mListView.setLoadCompleted();
        }
    
    下面看一下效果:

    之所以不在 LoadingListView 中把LoadingView写死,是为了方便定制,需要什么样的LoadingView可以自行定义。下面是我写的Loadingview:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#F5F6F8"
        android:gravity="center"
        android:padding="8dp">
    
        <ProgressBar
            android:id="@+id/progress_bar"
            android:layout_width="24dp"
            android:layout_height="24dp"
            android:layout_marginEnd="16dp"
            android:indeterminateTint="@color/colorWeakBlack"/>
    
        <TextView
            android:id="@+id/tv_hint"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/loading"
            android:textSize="15sp"
            android:textColor="@color/colorWeakBlack"/>
    
    </LinearLayout>
    

    使用实例可以参考:LoadingListView

    相关文章

      网友评论

          本文标题:Android实践 | ListView简单封装,实现上拉加载

          本文链接:https://www.haomeiwen.com/subject/fzlmiqtx.html