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
使用SwipeRefreshLayout和RecyclerView實現仿“簡書”下拉重新整理和上拉載入
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(){ // 邏輯程式碼