1. 程式人生 > >Android RecyclerView下拉重新整理和上拉載入封裝

Android RecyclerView下拉重新整理和上拉載入封裝

效果圖:


程式碼已經同步到github~

Gradle引入依賴:

  allprojects {
    		repositories {
    			...
    			maven { url 'https://jitpack.io' }
    		}
    	}


    dependencies {
    	        compile 'com.github.louyulin:PullLoadRecyclerView:v1.1'
    	}

關鍵程式碼使用:

//繫結元件
pullrv = (PullLoadRecyclerView) findViewById(R.id.pullrv);
//設定下拉顏色
pullrv.setSwipeRefreshColor(android.R.color.holo_blue_bright,android.R.color.holo_blue_dark,android.R.color.holo_blue_bright);
//設定列數和滾動方向
pullrv.setLayoutManager(4, LinearLayoutManager.VERTICAL);
//設定底部據高度
pullrv.setFootHeight(100);
//設定底佈局字型大小
pullrv.setFootTextSize(35.5f);
//設定底佈局字型顏色
pullrv.setFootTextColor(getResources().getColor(R.color.red));
//設定底佈局文字內容
pullrv.setFootTextContent ("設定字串");
//設定底部據背景顏色
pullrv.setFootBackGroundColor(getResources().getColor(R.color.colorPrimary));
//設定監聽
        pullrv.setOnPullLoadMoreListener(new PullLoadRecyclerView.OnPullLoadMoreListener() {
            @Override
            public void reRresh() {

            }

            @Override
            public void loadMore() {

            }
        });


原始碼分析:

繼承LinearLayout並將RecyclerView和底佈局包含在內

public class PullLoadRecyclerView extends LinearLayout {

    private Context mContext;
    private SwipeRefreshLayout mSwipeRefreshLayout;
    private boolean mIsRefresh = false; //是否是重新整理
    private boolean mIsLoadMore = false; //是否是載入更多
    private RecyclerView mRecyclerView;
    private View mFootView;
    private OnPullLoadMoreListener mOnPullLoadMoreListener;

    public PullLoadRecyclerView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initView(context);
    }

    public PullLoadRecyclerView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView(context);
    }

    public PullLoadRecyclerView(Context context) {
        super(context);
        initView(context);
    }

    private void initView(Context context) {
        mContext = context;
        View view = LayoutInflater.from(mContext).inflate(R.layout.pull_loadmore_layout, null);
        mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipeRefreshLayout);

        mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayoutOnRefresh());

        //處理RecyclerView
        mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerview);
        mRecyclerView.setHasFixedSize(true); //設定固定大小
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());//使用預設動畫
        mRecyclerView.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                return mIsRefresh || mIsLoadMore;
            }
        });

        mRecyclerView.setVerticalScrollBarEnabled(false);//隱藏滾動條
        mRecyclerView.addOnScrollListener(new RecyclerViewOnScroll());
        mFootView = view.findViewById(R.id.footer_view);
        ImageView imageView = (ImageView) mFootView.findViewById(R.id.iv_load_img);
   
        TextView textView = (TextView) mFootView.findViewById(R.id.tv_load_text);
        mFootView.setVisibility(View.GONE);
        //view 包含swipeRefreshLayout, RecyclerView, FootView
        this.addView(view);//
    }

    //設定重新整理時控制元件顏色漸變
    public void setSwipeRefreshColor(Integer ...colors) {
        for (int i = 0; i < colors.length ; i++) {
            mSwipeRefreshLayout.setColorSchemeResources(colors[i]);
        }
    }

    //外部可以設定recyclerview的列數

    public void setLayoutManager(int spanCount,int orientation){
        GridLayoutManager manager = new GridLayoutManager(mContext, spanCount);
        manager.setOrientation(orientation);
        mRecyclerView.setLayoutManager(manager);
    }

    public void setAdapter(RecyclerView.Adapter adapter) {
        if (adapter != null) {
            mRecyclerView.setAdapter(adapter);
        }
    }

    class SwipeRefreshLayoutOnRefresh implements SwipeRefreshLayout.OnRefreshListener{

        @Override
        public void onRefresh() {
             if (!mIsRefresh) {
                 mIsRefresh = true;
                 refreshData();
             }
        }
    }

    class RecyclerViewOnScroll extends RecyclerView.OnScrollListener {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            int firstItem = 0;
            int lastItem = 0;
            RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
            int totalCount = manager.getItemCount();
            if (manager instanceof GridLayoutManager) {
                GridLayoutManager gridlayoutManager = (GridLayoutManager) manager;
                //第一個完全可見的item
                firstItem = gridlayoutManager.findFirstCompletelyVisibleItemPosition();
                //最後一個完全可見的item
                lastItem = gridlayoutManager.findLastCompletelyVisibleItemPosition();
                if (firstItem == 0 || firstItem == RecyclerView.NO_POSITION) {
                    lastItem = gridlayoutManager.findLastVisibleItemPosition();
                }
            }
            //什麼時候觸發上拉載入更多?
            // 1.載入更多是false
            // 2.totalCount - 1 === lastItem
            // 3.mSwipeRefreshLayout可以用
            // 4. 不是處於下拉重新整理狀態
            // 5. 偏移量dx > 0 或dy > 0
            if (!mIsLoadMore
                && totalCount - 1 == lastItem
                && mSwipeRefreshLayout.isEnabled()
                && !mIsRefresh
                && (dx > 0 || dy > 0)) {
                mIsLoadMore = true;
                //在載入更多時,禁止mSwipeRefreshLayout使用
                mSwipeRefreshLayout.setEnabled(false);
                loadMoreData();
            } else {
                mSwipeRefreshLayout.setEnabled(true);
            }
        }
    }

    private void refreshData() {
        if (mOnPullLoadMoreListener != null) {
            mOnPullLoadMoreListener.reRresh();
        }
    }

    private void loadMoreData() {
        if (mOnPullLoadMoreListener != null) {
            mFootView.animate().translationY(0).setInterpolator(new AccelerateDecelerateInterpolator())
                    .setDuration(300).setListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationStart(Animator animation) {
                    super.onAnimationStart(animation);
                    mFootView.setVisibility(View.VISIBLE);
                    //mAnimationDrawable.start();
                }
            }).start();
            invalidate();
            mOnPullLoadMoreListener.loadMore();
        }
    }

    //設定重新整理完畢
    public void setRefreshCompleted() {
        mIsRefresh = false;
        setRefreshing(false);
    }

    //設定是否正在重新整理
    private void setRefreshing(final boolean isRefreshing) {
        mSwipeRefreshLayout.post(new Runnable() {
            @Override
            public void run() {
                mSwipeRefreshLayout.setRefreshing(isRefreshing);
            }
        });
    }

    public void setLoadMoreCompleted() {
        mIsLoadMore = false;
        mIsRefresh = false;
        setRefreshing(false);
        mFootView.animate().translationY(mFootView.getHeight()).setInterpolator(new AccelerateDecelerateInterpolator())
                .setDuration(300).start();
    }

    public interface OnPullLoadMoreListener {
        void reRresh();
        void loadMore();
    }

    public void setOnPullLoadMoreListener(OnPullLoadMoreListener listener) {
        mOnPullLoadMoreListener = listener;
    }
}


相關推薦

Android RecyclerView重新整理載入封裝

效果圖:程式碼已經同步到github~Gradle引入依賴: allprojects { repositories { ... maven { url 'https://jitpack.io' } } }

最全的使用RecyclerView實現重新整理載入更多

前言:            縱觀多數App,下拉重新整理和上拉載入更多是很常見的功能,但是谷歌官方只有一個SwipeRefreshLayout用來下拉重新整理,上拉載入更多還要自己做。      本篇文章基於RecyclerView簡單封裝了這兩個操作,下拉重

android smartRefresh重新整理載入

1.遠端依賴  compile 'com.scwang.smartrefresh:SmartRefreshLayout:1.0.5.1' 2.佈局中使用 <com.scwang.smartrefresh.layout.SmartRefreshLayout androi

Android重新整理載入

先看看XML佈局檔案,下拉重新整理和上拉載入哪個在外層並沒有什麼影響。最裡面嵌套了一個RecycleView。 <android.support.v4.widget.SwipeRefreshLayout     android:id="@+id/gridswipre

android自定義重新整理載入控制元件

import android.content.Context; import android.graphics.Point; import android.support.v4.view.MotionEventCompat; import android.support.v4.view.NestedScro

當scrollview巢狀多個recyclerview時如何實現整個頁面的重新整理載入

最近做的一個專案中有個佈局比較複雜一點,整個頁面是個srollview裡面又嵌套了幾個recycview,剛開始是有的滑動衝突卡頓的問題,通過如下方法解決了 mRecyclerView.setLayoutManager(new GridLayoutManager(getContext(),

RecyclerView三種顯示方式的重新整理載入更多

但是之前寫的那個有一點點的小問題,如果上拉重新整理,重新整理小圖示還沒有移動到重新整理位置,重新整理資料就已經獲取到,並且呼叫了setRefreshing(false),在setRefreshing(false)中會去呼叫translationTo(int from,i

Android分組列表懸停顯示,分組listView懸停效果,帶重新整理載入更多

分組列表,帶下拉重新整理和上拉載入更多【專案地址在文章最後!!】 效果圖: 實現過程,借鑑PinnedHeadListView,但是該demo沒有下拉重新整理功能,故將該控制元件整合到PullToRefresh 庫中,【PullToRefresh 庫為第

手把手教你實現RecyclerView重新整理載入更多

個人原創,轉載請註明出處http://blog.csdn.net/u012402124/article/details/78210639 2018年10月25日更新 讓大家花費時間看文章卻沒有解決需求,隨著bug的增多內心的愧疚感逐漸增強,但幾個月前的程式

android 模仿知乎重新整理載入

效果圖如下 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/

自定義RecyclerView實現重新整理載入

2)尾部佈局(上拉載入部分):refresh_recyclerview_footer.xml<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andro

使用SwipeRefreshLayoutRecyclerView實現仿“簡書”重新整理載入

package com.leohan.refresh;import android.os.Bundle;import android.os.Handler;import android.support.v4.widget.SwipeRefreshLayout;import android.support.v7

自定義RecyclerView實現重新整理載入(第一種實現方式)

說明:該自定義RecyclerView只適用於layoutManager為LinearLayoutManager的情況,使用的還是RecyclerView.Adapter。效果圖使用1、編寫layout檔案<?xml version="1.0" encoding="ut

(Android)五分鐘讓你輕鬆學會重新整理載入更多

分享一個谷歌自帶的下拉重新整理和上拉載入更多例子: 先看效果圖: /** * 繼承自SwipeRefreshLayout,從而實現滑動到底部時上拉載入更多的功能. */ public class RefreshLayout extends SwipeRefreshL

Android 自定義重新整理載入

完整程式碼在最下面。。 頭佈局xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_pare

Android簡單實現重新整理重新整理

先把佈局檔案裡面新增一個ListView控制元件, <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.a

3秒鐘不懂你砍我:RecyclerView重新整理載入更多(開源中國List業務流程全解析)

這裡以開源中國開源資訊頁面為例子。 這個頁面資料的url:http://www.oschina.net/action/apiv2/news?pageToken= 是這樣的 json資料的結構: NewsBean返回成功與否的code和msg。 ResultBean返回的

採用SwipeFreshLayout+Recyclerview實現重新整理載入更多以及CoordinatorLayout的引入

       之前都是採用PullToRefresh進行下拉重新整理和下拉載入,現在採用谷歌自己的控制元件SwipeFreshLayout,配合Recyclerview來實現這一效果。使用SwipeRefreshLayout可以實現下拉重新整理,前提是佈局裡需要包裹一個可以

微信小程式重新整理載入

example One:如果所有頁面都要開啟下拉重新整理功能: aap.json中: "window":{       "enablePullDownRefresh":true, //開啟下拉重新整理功能       "navigatio

MUi重新整理載入click事件失效問題

今天應用MUi的上拉載入更多方法後,發現給li元素註冊點選click事件沒有反應。 最後折騰半個小時發現一個方法,用mui.on( )新增事件監聽,用tap代替click事件即可解決 mui("#ulId").on("tap","li",function(){ // 邏輯程式碼