基於PtrFrameLayout實現自定義仿京東下拉刷新控件


前言
最近基於項目需要,使用PtrFrameLayout框架實現了自定義的下拉刷新控件,大體效果類似於京東APP的下拉刷新動態效果。在這里和大家分享一下具體的思路和需要注意的地方,以便幫助有類似開發和學習需求的同學省點時間。如果這篇文章對大家實際開發有所幫助,還望大家多多轉發。

由於項目原因,本文不會涉及詳細的具體實現,主要是提供思路和關鍵點。感興趣的歡迎大家加入學習小組QQ群: 193765960,該群是技術分享和討論群,還請遵守小組紀律。

版權歸作者所有,如有轉發,請注明文章出處:https://xiaodanchen.github.io/

PtrFrameLayout開源項目下載地址

實現的目標和效果

1,盡可能的能夠包裹各類布局和控件,不要僅僅適用於listview。
2,通過animation-list的xml作為動畫的來源,方便替換
3,head部分通過layout xml定義,包括至少三部分:動畫部分,刷新狀態提示,上次刷新時間提示
(注:控件不支持上拉加載,其實按照邏輯,加載部分應該由子view自己實現比較好)

關鍵類

  • MyPtrFrameLayout.java:最終控件,在我們的layout xml中用來包裹我們需要下拉刷新的布局。該類主要參照官方的PtrClassicFrameLayout.java實現。
  • MyPtrHeaderView.java:MyPtrFrameLayout的頭部,布局由layout_header_view.xml定義。該類主要參照官方的PtrClassicDefaultHeader.java實現。
  • MyPtrAnimationDrawable.java:MyPtrHeaderView的動畫部分,動畫來源於自定義的res/drawable/xxx_animation.xml

代碼精要

MyPtrAnimationDrawable.java

public class MyPtrAnimationDrawable extends Drawable implements Animatable { public MyPtrAnimationDrawable(Context context, View parent) { mContext = context; mParent = parent; initAnimations(); } ...... @Override public void start() { mAnimation.start(); } @Override public void stop() { mAnimation.stop(); } private void initAnimations() { mParent.setBackgroundResource(R.drawable.xxx_animation); mAnimation = (AnimationDrawable) mParent.getBackground(); } ...... } 

MyPtrHeaderView.java

public class MyPtrHeaderView extends FrameLayout implements PtrUIHandler { ...... protected void initViews() { View header = LayoutInflater.from(getContext()).inflate(R.layout.layout_header_view, this); mAnimaView = header.findViewById(R.id.xxx); mDrawable = new MyPtrAnimationDrawable(mContext, mAnimaView); mDrawable.start(); mRefreshTextView = (TextView) header.findViewById(R.id.yyy); mLastUpdateTextView = (TextView) header.findViewById(R.id.zzz); } ...... //主要邏輯參照官方的**PtrClassicDefaultHeader.java**實現,代碼官方類都有。這里不方便多寫,但是不難,基本邏輯都一樣。說白了就是替換,窗戶紙一層。 } 

MyPtrFrameLayout.java

//該類主要參照官方的**PtrClassicFrameLayout.java**實現。代碼總共沒有多少行,純替換。非重點就不啰嗦的貼代碼了。 

重要的知識點(*********)

  • 當我們的下拉刷新控件包裹了可滑動的視圖布局時,當視圖上滑出屏幕一部分時再下拉視圖,會發現我們的視圖滑出去的部分沒有滑回來,而是出現了被下來控件headerview遮蓋的情況。

  • 通過設置setPullToRefresh(boolean pull_2_fresh)方法可以設置釋放刷新還是下拉過程中到達刷新邊界自動刷新

經查資料,發現官方早已給我們封裝好了默認的處理類。不廢話,直接上代碼:

//加入在MainActivity中使用了MyPtrFrameLayout下拉刷新控件布局 private void initView(){ frame = (MyPtrFrameLayout) view.findViewById(R.id.my_ptr_framelayout); frame.setPullToRefresh(true);//true:下拉過程中刷新;false:釋放刷新 frame.setLastUpdateTimeKey(HomePage.class.getName()); //以下代碼是解決滑出視圖被遮蓋的關鍵: //1. 使用官方提供的PtrDefaultHandler類 frame.setPtrHandler(new PtrDefaultHandler() { @Override public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) { //2. 使用這個代碼可以解決滑動沖突(*****),切記 return PtrDefaultHandler.checkContentCanBePulledDown(frame, content, header)&&!frame.isRefreshing(); } @Override public void onRefreshBegin(PtrFrameLayout frame) { //加載數據,回調刷新界面的代碼 } }); } 

參考:
下拉刷新PtrFrameLayout組件的使用



作者:肖丹晨
鏈接:https://www.jianshu.com/p/c5c9985765bf
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM