Skip to content

Commit 86d2d24

Browse files
committed
增加了DefaultHeader组件并将SmartRefreshControl默认设置为他
Signed-off-by: 2534290808 <2534290808@qq.com>
1 parent cda01f4 commit 86d2d24

File tree

10 files changed

+496
-53
lines changed

10 files changed

+496
-53
lines changed

.idea/workspace.xml

Lines changed: 231 additions & 33 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

AnyHeader.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import React, {Component} from 'react';
2+
import {
3+
StyleSheet,
4+
View,
5+
Text,
6+
requireNativeComponent,
7+
ViewPropTypes,
8+
findNodeHandle,
9+
UIManager,
10+
} from 'react-native';
11+
import PropTypes from 'prop-types';
12+
13+
const RCTAnyHeader = requireNativeComponent('RCTAnyHeader', RCTAnyHeader);
14+
15+
class AnyHeader extends Component {
16+
17+
render() {
18+
return (
19+
<RCTAnyHeader
20+
ref="refreshLayout"
21+
{...this.props}
22+
/>
23+
24+
)
25+
}
26+
}
27+
28+
AnyHeader.propTypes = {
29+
...ViewPropTypes,
30+
}
31+
export default AnyHeader;

DefaultHeader.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import React, {Component} from 'react';
2+
import {
3+
StyleSheet,
4+
View,
5+
Text,
6+
requireNativeComponent,
7+
ViewPropTypes,
8+
findNodeHandle,
9+
UIManager,
10+
} from 'react-native';
11+
import PropTypes from 'prop-types';
12+
13+
const RCTDefaultHeader = requireNativeComponent('RCTDefaultHeader', RCTDefaultHeader);
14+
15+
class DefaultHeader extends Component {
16+
17+
render() {
18+
return (
19+
<RCTDefaultHeader
20+
ref="refreshLayout"
21+
{...this.props}
22+
/>
23+
24+
)
25+
}
26+
}
27+
28+
DefaultHeader.propTypes = {
29+
...ViewPropTypes,
30+
}
31+
export default DefaultHeader;

SmartRefreshControl.js

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import {
99
} from 'react-native';
1010
import ClassicsHeader from "./ClassicsHeader";
1111
import {ViewPropTypes,PropTypes} from './Util'
12+
import DefaultHeader from "./DefaultHeader";
1213

1314
const SmartRefreshLayout = requireNativeComponent('SmartRefreshLayout', SmartRefreshControl);
1415

@@ -34,9 +35,11 @@ class SmartRefreshControl extends Component {
3435
renderHeader=()=>{
3536
const {HeaderComponent}=this.props;
3637
if(HeaderComponent){
37-
return HeaderComponent;
38+
return React.cloneElement(HeaderComponent,{
39+
key:'header'
40+
});
3841
}
39-
return <View><Text></Text></View>
42+
return <DefaultHeader/>
4043
}
4144
_onSmartRefresh=()=>{
4245
this.props.onRefresh && this.props.onRefresh();
@@ -55,8 +58,12 @@ class SmartRefreshControl extends Component {
5558
{...nativeProps}
5659
>
5760
{this.renderHeader()}
58-
{this.props.children}
59-
{this.renderFooter()}
61+
{React.cloneElement(
62+
this.props.children,
63+
{
64+
key:'content'
65+
}
66+
)}
6067
</SmartRefreshLayout>
6168

6269
)

android/src/main/java/com/lmy/header/AnyHeader.java

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ public class AnyHeader extends LinearLayout implements RefreshHeader {
3434
private View refreshingView;
3535
protected int mPaddingTop = 20;
3636
protected int mPaddingBottom = 20;
37+
private RefreshKernel mRefreshKernel;
3738

3839
public AnyHeader(Context context) {
3940
super(context);
@@ -47,10 +48,14 @@ public AnyHeader(Context context, AttributeSet attrs, int defStyleAttr) {
4748
super(context, attrs, defStyleAttr);
4849
this.initView(context);
4950
}
51+
@Override
52+
public void onInitialized(@NonNull RefreshKernel kernel, int height, int extendHeight) {
53+
mRefreshKernel = kernel;
54+
// mRefreshKernel.requestDrawBackgroundForHeader(Color.parseColor("red"));
55+
}
5056
private void initView(Context context) {
51-
setGravity(Gravity.CENTER_HORIZONTAL);
52-
setOrientation(LinearLayout.VERTICAL);
53-
view = new TextView(context);
57+
setGravity(Gravity.CENTER);
58+
//view = new TextView(context);
5459
//mProgressDrawable = new ProgressDrawable();
5560
// mArrowView = new PathsView(context);
5661
//mProgressView = new ImageView(context);
@@ -59,8 +64,8 @@ private void initView(Context context) {
5964
// addView(mProgressView, DensityUtil.dp2px(20), DensityUtil.dp2px(20));
6065
// addView(mArrowView, DensityUtil.dp2px(20), DensityUtil.dp2px(20));
6166
addView(new View(context), DensityUtil.dp2px(20), DensityUtil.dp2px(20));
62-
((TextView)view).setText("SmartRefreshLayout");
63-
addView(view, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
67+
//((TextView)view).setText("SmartRefreshLayout");
68+
//addView(view, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
6469
setMinimumHeight(DensityUtil.dp2px(60));
6570
}
6671
@NonNull
@@ -69,11 +74,7 @@ public View getView() {
6974
}
7075
public void setView(View view){
7176
if(view !=null){
72-
setGravity(Gravity.CENTER_HORIZONTAL);
73-
setOrientation(LinearLayout.VERTICAL);
74-
removeAllViews();
7577
addView(view, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
76-
setMinimumHeight(DensityUtil.dp2px(60));
7778
}
7879
//return this;
7980
}
@@ -96,9 +97,7 @@ public void onStateChanged(RefreshLayout refreshLayout, RefreshState oldState, R
9697
public boolean isSupportHorizontalDrag() {
9798
return false;
9899
}
99-
@Override
100-
public void onInitialized(RefreshKernel kernel, int height, int extendHeight) {
101-
}
100+
102101
@Override
103102
public void onHorizontalDrag(float percentX, int offsetX, int offsetMax) {
104103
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.lmy.header;
2+
3+
import com.facebook.react.uimanager.ThemedReactContext;
4+
import com.facebook.react.uimanager.ViewGroupManager;
5+
6+
/**
7+
* Created by painter.g on 2018/3/12.
8+
*/
9+
10+
public class AnyHeaderManager extends ViewGroupManager<AnyHeader> {
11+
@Override
12+
public String getName() {
13+
return "RCTAnyHeader";
14+
}
15+
16+
@Override
17+
protected AnyHeader createViewInstance(ThemedReactContext reactContext) {
18+
return new AnyHeader(reactContext);
19+
}
20+
}
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package com.lmy.header;
2+
3+
import android.content.Context;
4+
import android.support.annotation.ColorInt;
5+
import android.support.annotation.NonNull;
6+
import android.support.annotation.Nullable;
7+
import android.util.AttributeSet;
8+
import android.view.Gravity;
9+
import android.view.View;
10+
import android.widget.ImageView;
11+
import android.widget.LinearLayout;
12+
import android.widget.TextView;
13+
14+
import com.scwang.smartrefresh.layout.api.RefreshHeader;
15+
import com.scwang.smartrefresh.layout.api.RefreshKernel;
16+
import com.scwang.smartrefresh.layout.api.RefreshLayout;
17+
import com.scwang.smartrefresh.layout.constant.RefreshState;
18+
import com.scwang.smartrefresh.layout.constant.SpinnerStyle;
19+
import com.scwang.smartrefresh.layout.internal.ProgressDrawable;
20+
import com.scwang.smartrefresh.layout.internal.pathview.PathsView;
21+
import com.scwang.smartrefresh.layout.util.DensityUtil;
22+
23+
/**
24+
* Created by painter.g on 2018/3/12.
25+
*/
26+
27+
public class DefaultHeader extends LinearLayout implements RefreshHeader {
28+
private TextView mHeaderText;//标题文本
29+
private PathsView mArrowView;//下拉箭头
30+
private ImageView mProgressView;//刷新动画视图
31+
private ProgressDrawable mProgressDrawable;//刷新动画
32+
public DefaultHeader(Context context) {
33+
super(context);
34+
this.initView(context);
35+
}
36+
37+
public DefaultHeader(Context context, @Nullable AttributeSet attrs) {
38+
super(context, attrs);
39+
this.initView(context);
40+
}
41+
42+
public DefaultHeader(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
43+
super(context, attrs, defStyleAttr);
44+
this.initView(context);
45+
}
46+
47+
48+
49+
private void initView(Context context) {
50+
setGravity(Gravity.CENTER);
51+
mHeaderText = new TextView(context);
52+
mHeaderText.setText("下拉开始刷新");
53+
mProgressDrawable = new ProgressDrawable();
54+
mArrowView = new PathsView(context);
55+
mProgressView = new ImageView(context);
56+
mProgressView.setImageDrawable(mProgressDrawable);
57+
mArrowView.parserColors(0xff666666);
58+
mArrowView.parserPaths("M20,12l-1.41,-1.41L13,16.17V4h-2v12.17l-5.58,-5.59L4,12l8,8 8,-8z");
59+
addView(mProgressView, DensityUtil.dp2px(20), DensityUtil.dp2px(20));
60+
addView(mArrowView, DensityUtil.dp2px(20), DensityUtil.dp2px(20));
61+
addView(new View(context), DensityUtil.dp2px(20), DensityUtil.dp2px(20));
62+
addView(mHeaderText, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
63+
setMinimumHeight(DensityUtil.dp2px(60));
64+
}
65+
@NonNull
66+
public View getView() {
67+
return this;//真实的视图就是自己,不能返回null
68+
}
69+
@Override
70+
public SpinnerStyle getSpinnerStyle() {
71+
return SpinnerStyle.Translate;//指定为平移,不能null
72+
}
73+
@Override
74+
public void onStartAnimator(RefreshLayout layout, int headHeight, int extendHeight) {
75+
mProgressDrawable.start();//开始动画
76+
}
77+
@Override
78+
public int onFinish(RefreshLayout layout, boolean success) {
79+
mProgressDrawable.stop();//停止动画
80+
if (success){
81+
mHeaderText.setText("刷新完成");
82+
} else {
83+
mHeaderText.setText("刷新失败");
84+
}
85+
return 500;//延迟500毫秒之后再弹回
86+
}
87+
@Override
88+
public void onStateChanged(RefreshLayout refreshLayout, RefreshState oldState, RefreshState newState) {
89+
switch (newState) {
90+
case None:
91+
case PullDownToRefresh:
92+
mHeaderText.setText("下拉开始刷新");
93+
mArrowView.setVisibility(VISIBLE);//显示下拉箭头
94+
mProgressView.setVisibility(GONE);//隐藏动画
95+
mArrowView.animate().rotation(0);//还原箭头方向
96+
break;
97+
case Refreshing:
98+
mHeaderText.setText("正在刷新");
99+
mProgressView.setVisibility(VISIBLE);//显示加载动画
100+
mArrowView.setVisibility(GONE);//隐藏箭头
101+
break;
102+
case ReleaseToRefresh:
103+
mHeaderText.setText("释放立即刷新");
104+
mArrowView.animate().rotation(180);//显示箭头改为朝上
105+
break;
106+
}
107+
}
108+
@Override
109+
public boolean isSupportHorizontalDrag() {
110+
return false;
111+
}
112+
@Override
113+
public void onInitialized(RefreshKernel kernel, int height, int extendHeight) {
114+
}
115+
@Override
116+
public void onHorizontalDrag(float percentX, int offsetX, int offsetMax) {
117+
}
118+
@Override
119+
public void onPulling(float percent, int offset, int headHeight, int extendHeight) {
120+
}
121+
@Override
122+
public void onReleasing(float percent, int offset, int headHeight, int extendHeight) {
123+
}
124+
125+
@Override
126+
public void onReleased(RefreshLayout refreshLayout, int height, int extendHeight) {
127+
128+
}
129+
130+
@Override
131+
public void setPrimaryColors(@ColorInt int ... colors){
132+
}
133+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.lmy.header;
2+
3+
import com.facebook.react.uimanager.SimpleViewManager;
4+
import com.facebook.react.uimanager.ThemedReactContext;
5+
6+
/**
7+
* Created by painter.g on 2018/3/12.
8+
*/
9+
10+
public class DefaultHeaderMananger extends SimpleViewManager<DefaultHeader> {
11+
@Override
12+
public String getName() {
13+
return "RCTDefaultHeader";
14+
}
15+
16+
@Override
17+
protected DefaultHeader createViewInstance(ThemedReactContext reactContext) {
18+
return new DefaultHeader(reactContext);
19+
}
20+
}

android/src/main/java/com/lmy/smartrefreshlayout/SmartRefreshLayoutManager.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import com.facebook.react.uimanager.annotations.ReactProp;
1111
import com.facebook.react.uimanager.events.RCTEventEmitter;
1212
import com.lmy.header.AnyHeader;
13-
import com.scwang.smartrefresh.layout.api.RefreshFooter;
1413
import com.scwang.smartrefresh.layout.api.RefreshHeader;
1514
import com.scwang.smartrefresh.layout.api.RefreshLayout;
1615
import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener;
@@ -124,13 +123,14 @@ public void addView(ReactSmartRefreshLayout parent, View child, int index) {
124123
((AnyHeader)header).setView(child);
125124
}
126125
parent.setRefreshHeader(header);
126+
//parent.setRefreshHeader(new MaterialHeader(themedReactContext).setShowBezierWave(true));
127127
break;
128128
case 1:
129129
parent.setRefreshContent(child);
130130
break;
131131
case 2:
132-
RefreshFooter footer=(RefreshFooter)child;
133-
parent.setRefreshFooter(footer);
132+
//RefreshFooter footer=(RefreshFooter)child;
133+
//parent.setRefreshFooter(footer);
134134
break;
135135
default:break;
136136

android/src/main/java/com/lmy/smartrefreshlayout/SmartRefreshLayoutPackage.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
import com.facebook.react.bridge.NativeModule;
66
import com.facebook.react.bridge.ReactApplicationContext;
77
import com.facebook.react.uimanager.ViewManager;
8+
import com.lmy.header.AnyHeaderManager;
89
import com.lmy.header.ClassicsHeaderManager;
10+
import com.lmy.header.DefaultHeaderMananger;
911
import com.lmy.header.MaterialHeaderManager;
1012
import com.lmy.header.StoreHouseHeaderManager;
1113

@@ -32,7 +34,9 @@ public List<ViewManager> createViewManagers(ReactApplicationContext reactContext
3234
new SmartRefreshLayoutManager(),
3335
new ClassicsHeaderManager(),
3436
new StoreHouseHeaderManager(),
35-
new MaterialHeaderManager()
37+
new MaterialHeaderManager(),
38+
new AnyHeaderManager(),
39+
new DefaultHeaderMananger()
3640
);
3741
}
3842
}

0 commit comments

Comments
 (0)