SmartRefreshLayout
🔥下拉刷新、上拉加载、二级刷新、淘宝二楼、RefreshLayout、OverScroll,Android智能下拉刷新框架,支持越界回弹、越界拖动,具有极强的扩展性,集成了几十种炫酷的Header 和 Footer。
Top Related Projects
Render After Effects animations natively on Android and iOS, Web, and React Native
A pull to refresh layout for android, the RecyclerRefreshLayout is based on the SwipeRefreshLayout. support all the views, highly customizable, code simplicity, etc. really a practical RefreshLayout!
Ultra Pull to Refresh for Android. Support all the views.
Phoenix Pull-to-Refresh
A reusable pull-to-refresh and pull-to-loadmore widget
Quick Overview
SmartRefreshLayout is an Android pull-to-refresh library that provides a flexible and customizable refresh layout for Android applications. It supports various refresh animations, automatic loading, and customizable header and footer components, making it a versatile solution for implementing pull-to-refresh functionality in Android apps.
Pros
- Highly customizable with support for various refresh animations and styles
- Comprehensive documentation and extensive examples
- Large community support and regular updates
- Compatible with most Android versions and RecyclerView, ListView, and ScrollView
Cons
- Steep learning curve for advanced customizations
- Large library size may impact app performance if not optimized
- Some features may require additional dependencies
Code Examples
- Basic implementation:
refreshLayout.setRefreshHeader(ClassicsHeader(context))
refreshLayout.setRefreshFooter(ClassicsFooter(context))
refreshLayout.setOnRefreshListener { refreshLayout ->
// Perform refresh operation
refreshLayout.finishRefresh(2000) // Finish after 2 seconds
}
refreshLayout.setOnLoadMoreListener { refreshLayout ->
// Perform load more operation
refreshLayout.finishLoadMore(2000) // Finish after 2 seconds
}
- Custom refresh header:
class CustomHeader(context: Context) : RefreshHeader {
// Implement RefreshHeader interface methods
}
refreshLayout.setRefreshHeader(CustomHeader(context))
- Programmatically trigger refresh:
refreshLayout.autoRefresh() // Trigger refresh animation
refreshLayout.autoLoadMore() // Trigger load more animation
Getting Started
- Add the dependency to your app's
build.gradle
file:
implementation 'io.github.scwang90:refresh-layout-kernel:2.0.5'
implementation 'io.github.scwang90:refresh-header-classics:2.0.5'
- Add the SmartRefreshLayout to your layout XML:
<com.scwang.smart.refresh.layout.SmartRefreshLayout
android:id="@+id/refreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.scwang.smart.refresh.header.ClassicsHeader
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never"/>
<com.scwang.smart.refresh.footer.ClassicsFooter
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</com.scwang.smart.refresh.layout.SmartRefreshLayout>
- Initialize and configure the SmartRefreshLayout in your Activity or Fragment:
val refreshLayout: SmartRefreshLayout = findViewById(R.id.refreshLayout)
refreshLayout.setOnRefreshListener { refreshLayout ->
// Perform refresh operation
refreshLayout.finishRefresh(2000)
}
Competitor Comparisons
Render After Effects animations natively on Android and iOS, Web, and React Native
Pros of Lottie-Android
- Supports complex animations created in Adobe After Effects
- Renders animations natively on Android, reducing file size and improving performance
- Extensive documentation and community support
Cons of Lottie-Android
- Limited to animations created in After Effects or compatible tools
- May require more setup and integration effort for simple animations
- Potential performance issues with very complex animations
Code Comparison
SmartRefreshLayout:
RefreshLayout refreshLayout = findViewById(R.id.refreshLayout);
refreshLayout.setRefreshHeader(new ClassicsHeader(this));
refreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(RefreshLayout refreshlayout) {
refreshlayout.finishRefresh(2000/*,false*/);//传入false表示刷新失败
}
});
Lottie-Android:
LottieAnimationView animationView = findViewById(R.id.animation_view);
animationView.setAnimation(R.raw.data);
animationView.setRepeatCount(LottieDrawable.INFINITE);
animationView.playAnimation();
SmartRefreshLayout focuses on creating customizable pull-to-refresh layouts, while Lottie-Android specializes in rendering complex animations. SmartRefreshLayout is more suitable for implementing refresh functionalities, whereas Lottie-Android excels in displaying rich, vector-based animations. The code snippets demonstrate the ease of setup for both libraries, with SmartRefreshLayout requiring slightly more configuration for its specific use case.
A pull to refresh layout for android, the RecyclerRefreshLayout is based on the SwipeRefreshLayout. support all the views, highly customizable, code simplicity, etc. really a practical RefreshLayout!
Pros of RecyclerRefreshLayout
- Lightweight and focused specifically on RecyclerView refresh functionality
- Simple implementation with minimal configuration required
- Supports both pull-to-refresh and push-to-load-more actions
Cons of RecyclerRefreshLayout
- Limited customization options compared to SmartRefreshLayout
- Fewer animation styles and header/footer designs available
- Less active development and community support
Code Comparison
RecyclerRefreshLayout:
RecyclerRefreshLayout refreshLayout = findViewById(R.id.refresh_layout);
refreshLayout.setOnRefreshListener(new RecyclerRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
// Refresh logic here
}
});
SmartRefreshLayout:
SmartRefreshLayout refreshLayout = findViewById(R.id.refresh_layout);
refreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(@NonNull RefreshLayout refreshLayout) {
// Refresh logic here
}
});
Both libraries offer similar basic functionality for implementing pull-to-refresh in Android applications. However, SmartRefreshLayout provides more extensive customization options, a wider range of built-in header and footer styles, and better support for various view types beyond RecyclerView. RecyclerRefreshLayout is more lightweight and focused specifically on RecyclerView, which may be preferable for simpler projects or when minimizing app size is a priority.
Ultra Pull to Refresh for Android. Support all the views.
Pros of android-Ultra-Pull-To-Refresh
- Simpler implementation with fewer dependencies
- Lightweight and focused solely on pull-to-refresh functionality
- Easier to customize for basic pull-to-refresh needs
Cons of android-Ultra-Pull-To-Refresh
- Less feature-rich compared to SmartRefreshLayout
- Limited built-in header styles and animations
- Not actively maintained (last update in 2018)
Code Comparison
android-Ultra-Pull-To-Refresh:
PtrFrameLayout mPtrFrame = (PtrFrameLayout) findViewById(R.id.rotate_header_list_view_frame);
mPtrFrame.setLastUpdateTimeRelateObject(this);
mPtrFrame.setPtrHandler(new PtrHandler() {
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
updateData();
}
});
SmartRefreshLayout:
RefreshLayout refreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout);
refreshLayout.setRefreshHeader(new ClassicsHeader(this));
refreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(RefreshLayout refreshlayout) {
refreshlayout.finishRefresh(2000/*,false*/);
}
});
SmartRefreshLayout offers more built-in features and customization options, while android-Ultra-Pull-To-Refresh provides a simpler, more lightweight solution. SmartRefreshLayout is actively maintained and has a larger community, but android-Ultra-Pull-To-Refresh may be sufficient for basic pull-to-refresh needs.
Phoenix Pull-to-Refresh
Pros of Phoenix
- Offers a unique and visually appealing pull-to-refresh animation
- Lightweight and focused on a single, well-executed feature
- Easy to implement with minimal configuration required
Cons of Phoenix
- Limited customization options compared to SmartRefreshLayout
- Lacks advanced features like automatic loading and multiple refresh styles
- Less actively maintained, with fewer recent updates
Code Comparison
Phoenix implementation:
PullToRefreshView mPullToRefreshView = (PullToRefreshView) findViewById(R.id.pull_to_refresh);
mPullToRefreshView.setOnRefreshListener(new PullToRefreshView.OnRefreshListener() {
@Override
public void onRefresh() {
mPullToRefreshView.postDelayed(new Runnable() {
@Override
public void run() {
mPullToRefreshView.setRefreshing(false);
}
}, REFRESH_DELAY);
}
});
SmartRefreshLayout implementation:
RefreshLayout refreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout);
refreshLayout.setRefreshHeader(new ClassicsHeader(this));
refreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(RefreshLayout refreshlayout) {
refreshlayout.finishRefresh(2000/*,false*/);
}
});
Both libraries offer simple implementation, but SmartRefreshLayout provides more options for customization and advanced features out of the box.
A reusable pull-to-refresh and pull-to-loadmore widget
Pros of SwipeToLoadLayout
- Simpler implementation with fewer customization options, making it easier to set up quickly
- Lightweight library with a smaller footprint
- Supports both pull-to-refresh and load-more functionality out of the box
Cons of SwipeToLoadLayout
- Less actively maintained, with fewer recent updates compared to SmartRefreshLayout
- Limited animation options and visual customization compared to SmartRefreshLayout
- Lacks advanced features like automatic refresh detection and nested scrolling support
Code Comparison
SwipeToLoadLayout:
<com.aspsine.swipetoloadlayout.SwipeToLoadLayout
android:id="@+id/swipeToLoadLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/swipe_target"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</com.aspsine.swipetoloadlayout.SwipeToLoadLayout>
SmartRefreshLayout:
<com.scwang.smart.refresh.layout.SmartRefreshLayout
android:id="@+id/refreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</com.scwang.smart.refresh.layout.SmartRefreshLayout>
Both libraries offer similar basic functionality, but SmartRefreshLayout provides more advanced features and customization options at the cost of a slightly more complex implementation.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
Androidæºè½ä¸æå·æ°æ¡æ¶-SmartRefreshLayout
English | ä¸æ
SmartRefreshLayout以æé ä¸ä¸ªå¼ºå¤§ï¼ç¨³å®ï¼æççä¸æå·æ°æ¡æ¶ä¸ºç®æ ï¼å¹¶éæåç§çç«é ·ãå¤æ ·ãå®ç¨ãç¾è§çHeaderåFooterã æ£å¦ååæ说ï¼SmartRefreshLayoutæ¯ä¸ä¸ªâèªæâæè âæºè½âçä¸æå·æ°å¸å±ï¼ç±äºå®çâæºè½âï¼å®ä¸åªæ¯æ¯æææçViewï¼è¿æ¯æå¤å±åµå¥çè§å¾ç»æã å®ç»§æ¿èªViewGroup èä¸æ¯FrameLayoutæLinearLayoutï¼æé«äºæ§è½ã ä¹å¸åäºç°å¨æµè¡çåç§å·æ°å¸å±çä¼ç¹ï¼å æ¬è°·æå®æ¹ç SwipeRefreshLayoutï¼ å ¶ä»ç¬¬ä¸æ¹ç Ultra-Pull-To-RefreshãTwinklingRefreshLayout ã è¿éæäºåç§ç«é ·ç Header å Footerã
IOSçæ¬
IOSçæ¬ï¼é¾æ¥
å½å å é
github ç±äºä½ æçåå ï¼ä¸è½½é度ç¼æ ¢ï¼å¾çä¹æ æ³æ¥çï¼å¯ä»¥è·³è½¬ å½å éå
ç¹ç¹åè½:
- æ¯æå¤ç¹è§¦æ¸
- æ¯ææ·å®äºæ¥¼åäºçº§å·æ°
- æ¯æåµå¥å¤å±çè§å¾ç»æ Layout (LinearLayout,FrameLayout...)
- æ¯æææç Viewï¼AbsListViewãRecyclerViewãWebView....Viewï¼
- æ¯æèªå®ä¹å¹¶ä¸å·²ç»éæäºå¾å¤ç«é ·ç Header å Footer.
- æ¯æå ListView çæ ç¼åæ¥æ»å¨ å CoordinatorLayout çåµå¥æ»å¨ .
- æ¯æèªå¨å·æ°ãèªå¨ä¸æå è½½ï¼èªå¨æ£æµå表æ¯æ§æ»å¨å°åºé¨ï¼èä¸ç¨æå¨ä¸æï¼.
- æ¯æèªå®ä¹åå¼¹å¨ç»çæå¼å¨ï¼å®ç°åç§ç«é ·çå¨ç»ææ.
- æ¯æ设置主é¢æ¥éé ä»»ä½åºæ¯ç Appï¼ä¸ä¼åºç°ç«é ·ä½å¾å°´å°¬çæ åµ.
- æ¯æ设å¤ç§æ»å¨æ¹å¼ï¼å¹³ç§»ãæ伸ãèååºå®ã顶å±åºå®ãå ¨å±
- æ¯æææå¯æ»å¨è§å¾çè¶çåå¼¹
- æ¯æ Header å Footer 交æ¢æ··ç¨
- æ¯æ AndroidX
- æ¯æ横åå·æ°
- æ¯æIOS
ä¼ éé¨
- å±æ§ææ¡£
- 常è§é®é¢
- æºè½ä¹å¤
- æ´æ°æ¥å¿
- å客æç«
- æºç ä¸è½½
- å¤ç¹è§¦æ¸
- èªå®ä¹Header
Demo
项ç®æ¼ç¤º
个人é¦é¡µ | å¾®åå表 |
---|---|
é¤é¥®ç¾é£ | 个人ä¸å¿ |
---|---|
æ ·å¼æ¼ç¤º Style
Delivery | DropBox |
---|---|
Refresh-your-delivery | Dropbox-Refresh |
ä¸é¢è¿ä¸¤ä¸ªæ¯æèªå·±å®ç°çï¼ä¸é¢çæ¯æægithubä¸å ¶å®ä¼ç§çHeaderè¿è¡çæ´çåéåè¿æä¼åï¼
BezierRadar | BezierCircle |
---|---|
Pull To Refresh | Pull Down To Refresh |
FlyRefresh | Classics |
---|---|
FlyRefresh | ClassicsHeader |
Phoenix | Taurus |
---|---|
Yalantis/Phoenix | Yalantis/Taurus |
BattleCity | HitBlock |
---|---|
FunGame/BattleCity | FunGame/HitBlock |
WaveSwipe | Material |
---|---|
WaveSwipeRefreshLayout | MaterialHeader |
StoreHouse | WaterDrop |
---|---|
CRefreshLayout | WaterDrop |
çå°è¿ä¹å¤ç«é ·çHeaderï¼æ¯ä¸æ¯è§å¾å¾æ£ï¼è¿æ¶ä½ æ许ä¼æ å¿è¿ä¹å¤çHeaderéæå¨ä¸èµ·ï¼ä½æ¯å¹³æ¶åªä¼ç¨å°ä¸ä¸ªï¼æ¯ä¸æ¯è¦å¼å ¥å¾å¤æ ç¨ç代ç åèµæºï¼ V2.x çæ¬å·²ç»æä¾èµåºæåæ8个å å¦ï¼ç¨å°çæ¶åèªè¡å¼ç¨å°±å¯ä»¥å¦ï¼
- refresh-layout-kernel æ ¸å¿å¿ é¡»ä¾èµ
- refresh-header-classics ç»å ¸å·æ°å¤´
- refresh-header-radar é·è¾¾å·æ°å¤´
- refresh-header-falsify èæå·æ°å¤´
- refresh-header-material è°·æå·æ°å¤´
- refresh-header-two-level äºçº§å·æ°å¤´
- refresh-footer-ball çèå²å è½½
- refresh-footer-classics ç»å ¸å è½½
ç®åç¨ä¾
1.å¨ build.gradle ä¸æ·»å ä¾èµ
implementation 'androidx.appcompat:appcompat:1.0.0' //å¿
é¡» 1.0.0 以ä¸
implementation 'io.github.scwang90:refresh-layout-kernel:2.1.0' //æ ¸å¿å¿
é¡»ä¾èµ
implementation 'io.github.scwang90:refresh-header-classics:2.1.0' //ç»å
¸å·æ°å¤´
implementation 'io.github.scwang90:refresh-header-radar:2.1.0' //é·è¾¾å·æ°å¤´
implementation 'io.github.scwang90:refresh-header-falsify:2.1.0' //èæå·æ°å¤´
implementation 'io.github.scwang90:refresh-header-material:2.1.0' //è°·æå·æ°å¤´
implementation 'io.github.scwang90:refresh-header-two-level:2.1.0' //äºçº§å·æ°å¤´
implementation 'io.github.scwang90:refresh-footer-ball:2.1.0' //çèå²å è½½
implementation 'io.github.scwang90:refresh-footer-classics:2.1.0' //ç»å
¸å è½½
å¦æä½¿ç¨ AndroidX å å¨ gradle.properties ä¸æ·»å ï¼ä¸¤è¡é½ä¸è½å°å¢~
android.useAndroidX=true
android.enableJetifier=true
2.å¨XMLå¸å±æ件ä¸æ·»å SmartRefreshLayout
<?xml version="1.0" encoding="utf-8"?>
<com.scwang.smart.refresh.layout.SmartRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/refreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.scwang.smart.refresh.header.ClassicsHeader
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never"
android:background="#fff" />
<com.scwang.smart.refresh.footer.ClassicsFooter
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</com.scwang.smart.refresh.layout.SmartRefreshLayout>
3.å¨ Activity æè Fragment ä¸æ·»å 代ç
RefreshLayout refreshLayout = (RefreshLayout)findViewById(R.id.refreshLayout);
refreshLayout.setRefreshHeader(new ClassicsHeader(this));
refreshLayout.setRefreshFooter(new ClassicsFooter(this));
refreshLayout.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh(RefreshLayout refreshlayout) {
refreshlayout.finishRefresh(2000/*,false*/);//ä¼ å
¥false表示å·æ°å¤±è´¥
}
});
refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
@Override
public void onLoadMore(RefreshLayout refreshlayout) {
refreshlayout.finishLoadMore(2000/*,false*/);//ä¼ å
¥false表示å 载失败
}
});
使ç¨æå®ç Header å Footer
1.æ¹æ³ä¸ å ¨å±è®¾ç½®
public class App extends Application {
//static 代ç 段å¯ä»¥é²æ¢å
åæ³é²
static {
//设置å
¨å±çHeaderæ建å¨
SmartRefreshLayout.setDefaultRefreshHeaderCreator(new DefaultRefreshHeaderCreator() {
@Override
public RefreshHeader createRefreshHeader(Context context, RefreshLayout layout) {
layout.setPrimaryColorsId(R.color.colorPrimary, android.R.color.white);//å
¨å±è®¾ç½®ä¸»é¢é¢è²
return new ClassicsHeader(context);//.setTimeFormat(new DynamicTimeFormat("æ´æ°äº %s"));//æå®ä¸ºç»å
¸Headerï¼é»è®¤æ¯ è´å¡å°é·è¾¾Header
}
});
//设置å
¨å±çFooteræ建å¨
SmartRefreshLayout.setDefaultRefreshFooterCreator(new DefaultRefreshFooterCreator() {
@Override
public RefreshFooter createRefreshFooter(Context context, RefreshLayout layout) {
//æå®ä¸ºç»å
¸Footerï¼é»è®¤æ¯ BallPulseFooter
return new ClassicsFooter(context).setDrawableSize(20);
}
});
}
}
注æï¼æ¹æ³ä¸ 设置çHeaderåFooterçä¼å 级æ¯æä½çï¼å¦æåæ¶è¿ä½¿ç¨äºæ¹æ³äºãä¸ï¼å°ä¼è¢«å ¶å®æ¹æ³å代
2.æ¹æ³äº XMLå¸å±æ件æå®
<com.scwang.smart.refresh.layout.SmartRefreshLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/refreshLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#444444"
app:srlPrimaryColor="#444444"
app:srlAccentColor="@android:color/white"
app:srlEnablePreviewInEditMode="true">
<!--srlAccentColor srlPrimaryColor å°ä¼æ¹å Header å Footer ç主é¢é¢è²-->
<!--srlEnablePreviewInEditMode å¯ä»¥å¼å¯åå
³éé¢è§åè½-->
<com.scwang.smart.refresh.header.ClassicsHeader
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="@dimen/dimenPaddingCommon"
android:background="@android:color/white"
android:text="@string/description_define_in_xml"/>
<com.scwang.smart.refresh.footer.ClassicsFooter
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</com.scwang.smart.refresh.layout.SmartRefreshLayout>
注æï¼æ¹æ³äº XML设置çHeaderåFooterçä¼å 级æ¯ä¸ççï¼ä¼è¢«æ¹æ³ä¸è¦çãèä¸ä½¿ç¨æ¬æ¹æ³çæ¶åï¼Android Studio ä¼æé¢è§ææï¼å¦ä¸å¾ï¼
ä¸è¿ä¸ç¨æ å¿ï¼åªæ¯é¢è§ææï¼è¿è¡çæ¶ååªæä¸ææä¼åºç°~
3.æ¹æ³ä¸ Java代ç 设置
final RefreshLayout refreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout);
//设置 Header 为 è´å¡å°é·è¾¾ æ ·å¼
refreshLayout.setRefreshHeader(new BezierRadarHeader(this).setEnableHorizontalDrag(true));
//设置 Footer 为 çèå² æ ·å¼
refreshLayout.setRefreshFooter(new BallPulseFooter(this).setSpinnerStyle(SpinnerStyle.Scale));
4.æ´å¤ä½¿ç¨è¯´æ
æ··æ·
SmartRefreshLayout ä¸éè¦æ·»å æ··æ·è¿æ»¤ä»£ç ï¼å¹¶ä¸å·²ç»æ··æ·æµè¯éè¿ï¼å¦æä½ å¨é¡¹ç®ç使ç¨ä¸æ··æ·ä¹ååºç°é®é¢ï¼è¯·åæ¶éç¥æã
èµèµ
å¦æä½ å欢 SmartRefreshLayout ç设计ï¼æè§ SmartRefreshLayout 帮å©å°äºä½ ï¼å¯ä»¥ç¹å³ä¸è§ "Star" æ¯æä¸ä¸ è°¢è°¢ï¼ ^_^ ä½ ä¹è¿å¯ä»¥æ«æä¸é¢çäºç»´ç ~ 请ä½è åä¸æ¯åå¡ã
å¦æå¸ææèµ ä¹åè½è·å¾ç¸å ³ç帮å©ï¼å¯ä»¥éæ©å å ¥ä¸é¢çä»è´¹ç¾¤æ¥å代æ®éæèµ ï¼ä»è´¹ç¾¤å¯ä»¥ç´æ¥è·å¾ä½è çç´æ¥å¸®å©ï¼ä¸é®é¢åé¦ã
å¦æå¨æèµ çè¨ä¸å¤æ³¨å称ï¼å°ä¼è¢«è®°å½å°å表ä¸~ å¦æä½ ä¹æ¯githubå¼æºä½è ï¼æèµ æ¶å¯ä»¥çä¸github项ç®å°åæè 个人主页å°åï¼é¾æ¥å°ä¼è¢«æ·»å å°å表ä¸èµ·å°äºç¸æ¨å¹¿çä½ç¨ æèµ å表
åæ é¾æ¥
github/afKT/DevUtils
github/Loror
github/faith-hb/WidgetCase
github/Bamboy120315/Freedom
github/Tencent/APIJSON
github/dengyuhan
github/zrp2017
github/fly803/BaseProject
github/razerdp
github/SuperChenC/s-mvp
github/KingJA/LoadSir
github/jianshijiuyou
github/zxy198717
github/addappcn
github/RainliFu
github/sugarya
github/stormzhang
讨论
QQ解å³ç¾¤ - 602537182 ï¼ä»è´¹ï¼
è¿ç¾¤é¡»ç¥
èªå¼ç¾¤ä»¥æ¥ï¼è¿æ¯æå¾å¤çæåæåºäºå¾å¤é®é¢ï¼æä¹è§£å³äºå¾å¤é®é¢ï¼å ¶ä¸æ大åé®é¢æ¯æ¬åºçBug导è´ï¼ä¹æäºæ¯ä½¿ç¨è 项ç®æ¬ 身çç¯å¢é®é¢ï¼è¿è±è´¹äºæ大éçæ¶é´ï¼ç»è¿æçè§å¯åæµè¯ï¼å°ç®å为æ¢ï¼æ¬åºçbugå·²ç»è¶æ¥è¶å°ï¼å½ç¶ä¸è½è¯´å®å ¨æ²¡æï¼ä½æ¯ å·²ç»è½æ»¡è¶³å¾å¤§é¨å项ç®çéæ±ãæ以ä»ç°å¨èµ·ï¼æååºä¸ä¸ªå³å®ï¼æä¹åç讨论群æ¹æ解å³ç¾¤ï¼å¹¶å¼å¯ä»è´¹å ¥ç¾¤åè½ï¼ä¸ä¸ºè§£å³å¤§ 家å¨ä½¿ç¨æ¬åºæ¶éå°çé®é¢ï¼ä¸ç®¡æ¯æ¬åºbugè¿æ¯ï¼ç¹æ®ç项ç®ç¯å¢å¯¼è´ï¼å å«é¡¹ç®æ¬èº«çbugï¼ã æä¹æèªå·±çå·¥ä½å娱ä¹æ¶é´ï¼åªæ大家ç解åæ¯ææï¼ææè½ä¸å¿ç为大家解å³é®é¢ãä¸è¿ç¨æ å¿ï¼æå·²ç»å»ºç«äºå¦ä¸ä¸ªå¯ä»¥å è´¹ è¿å ¥çQQ讨论群ã
QQ讨论群 - 914275312 ï¼æ°ï¼ 477963933 ï¼æ»¡ï¼ 538979188 ï¼æ»¡ï¼
è¿ç¾¤é¡»ç¥
è¿ä¸ªç¾¤ï¼å è´¹è¿å ¥ï¼å¤§å®¶å¯ä»¥ç¸äºè®¨è®ºæ¬åºçç¸å ³ä½¿ç¨ååºç°çé®é¢ï¼ç¾¤ä¸»ä¹ä¼å¨éé¢è§£å³é®é¢ï¼å¦ææåºçé®é¢ï¼ç¾¤æåä¸è½å¸®å© 解å³ï¼éè¦ç¾¤ä¸»è§£å³ï¼ä½æ¯è¦è±è´¹ç¾¤ä¸»äºåé以ä¸çæ¶é´ï¼æ¬åºBugé¤å¤ï¼ï¼ç¾¤ä¸»å°ä¸ä¼è§£å³è¿ä¸ªé®é¢ï¼å¦æ项ç®ç´§æ¥ï¼è¯·ä»è´¹è¿å ¥è§£ å³ç¾¤è§£å³ï¼ä¸è¿æ³¨æï¼ä»è´¹ç¾¤ä¸ç¾¤ä¸»ä¼å¾è®¤çå¾åªåç解å³é®é¢ï¼ä½ä¹ä¸è½ä¿è¯å·²ç»è½å®ç¾è§£å³ï¼æè 转æ¢ä½¿ç¨å ¶ä»çå·æ°åºã
温馨æ示
å å ¥ç¾¤ççæ¡å¨æ¬ææ¡£ä¸å¯ä»¥æ¾å°~
å ¶ä»ä½å
MultiWaveHeader
SmartRefreshHorizontal
è¯åè¿æ¹
æè°¢
SwipeRefreshLayout
Ultra-Pull-To-Refresh
TwinklingRefreshLayout
BeautifulRefreshLayout
License
Copyright 2017 scwang90
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Top Related Projects
Render After Effects animations natively on Android and iOS, Web, and React Native
A pull to refresh layout for android, the RecyclerRefreshLayout is based on the SwipeRefreshLayout. support all the views, highly customizable, code simplicity, etc. really a practical RefreshLayout!
Ultra Pull to Refresh for Android. Support all the views.
Phoenix Pull-to-Refresh
A reusable pull-to-refresh and pull-to-loadmore widget
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot