<ImageView android:layout\_width="49dp"
android:layout\_height="49dp"
android:src="@drawable/business\_siehui"/>
<TextView android:layout\_width="wrap\_content"
android:layout\_height="wrap\_content"
android:textColor="@color/login\_black"
android:textSize="14dp"
android:text="协会"
android:layout\_marginTop="8dp"/>
</LinearLayout> <LinearLayout android:id="@+id/quanzili"
android:layout\_width="0dp"
android:layout\_height="match\_parent"
android:layout\_weight="1"
android:gravity="center"
android:orientation="vertical"\>
<ImageView android:layout\_width="49dp"
android:layout\_height="49dp"
android:src="@drawable/business\_list\_quanzi"/>
<TextView android:layout\_width="wrap\_content"
android:layout\_height="wrap\_content"
android:textColor="@color/login\_black"
android:textSize="14dp"
android:text="圈子"
android:layout\_marginTop="8dp"/>
</LinearLayout> <LinearLayout android:id="@+id/yuanquli"
android:layout\_width="0dp"
android:layout\_height="match\_parent"
android:layout\_weight="1"
android:gravity="center"
android:orientation="vertical"\>
<ImageView android:layout\_width="49dp"
android:layout\_height="49dp"
android:src="@drawable/business\_list\_yuanqu"/>
<TextView android:layout\_width="wrap\_content"
android:layout\_height="wrap\_content"
android:textColor="@color/login\_black"
android:textSize="14dp"
android:text="园区"
android:layout\_marginTop="8dp"/>
</LinearLayout>
</LinearLayout> <LinearLayout android:layout\_width="match\_parent"
android:layout\_height="10dp"
android:background="@color/gray\_b7"\></LinearLayout>
<RelativeLayout android:layout\_width="match\_parent"
android:layout\_height="49dp"
android:background="@color/white"
android:layout\_alignParentTop="true"
android:tag="sticky"
\>
<TextView android:id="@+id/activity\_business\_district\_library\_area"
android:layout\_width="wrap\_content"
android:layout\_height="49dp"
android:layout\_centerVertical="true"
android:drawablePadding="4dp"
android:drawableRight="@drawable/arrow\_down"
android:gravity="center\_vertical"
android:paddingLeft="20dp"
android:text="区域"
android:textColor="@color/common\_register\_black"
android:textSize="14sp"/>
<TextView android:id="@+id/activity\_business\_district\_library\_industry"
android:layout\_width="wrap\_content"
android:layout\_height="wrap\_content"
android:layout\_centerInParent="true"
android:drawablePadding="4dp"
android:drawableRight="@drawable/arrow\_down"
android:text="行业"
android:textColor="@color/common\_register\_black"
android:textSize="14sp"/>
<TextView android:id="@+id/activity\_business\_district\_library\_shangxi"
android:layout\_width="wrap\_content"
android:layout\_height="wrap\_content"
android:drawablePadding="4dp"
android:drawableRight="@drawable/arrow\_down"
android:text="商系"
android:textColor="@color/common\_register\_black"
android:textSize="14sp"
android:layout\_alignBaseline="@+id/activity\_business\_district\_library\_industry"
android:layout\_alignBottom="@+id/activity\_business\_district\_library\_industry"
android:layout\_alignParentRight="true"
android:layout\_alignParentEnd="true"
android:layout\_marginRight="19dp"
android:layout\_marginEnd="19dp"/>
</RelativeLayout> <LinearLayout android:layout\_width="match\_parent"
android:layout\_height="1dp"
android:background="@color/gray\_b7"\></LinearLayout>
<android.support.v7.widget.RecyclerView android:id="@+id/activity\_business\_district\_library\_recycler\_view"
android:layout\_width="match\_parent"
android:layout\_height="match\_parent"
android:background="@color/white"\>
</android.support.v7.widget.RecyclerView>
<!--<TextView-->
<!--android:layout\_width="match\_parent"--> <!--android:layout\_height="0.5dp"--> <!--android:layout\_marginTop="5dp"--> <!--android:layout\_marginBottom="5dp"--> <!--android:background="@color/gray\_white"/>-->
<!--<TextView--> <!--android:layout\_width="match\_parent"--> <!--android:layout\_height="1dp"--> <!--android:background="@drawable/line"/>-->
</LinearLayout>
</com.yuanxin.clan.core.util.StickyScrollView> </com.yuanxin.clan.mvp.view.PullToRefreshView>
附加PullToRefreshView
public class PullToRefreshView extends LinearLayout {
private static final int _REFRESHING\_TYPE\_HEADER_ \= 1;
private static final int _REFRESHING\_TYPE\_FOOTER_ \= 2;
private int nRefreshingType \= 0;
// refresh states
private static final int _PULL\_TO\_REFRESH_ \= 2;
private static final int _RELEASE\_TO\_REFRESH_ \= 3;
private static final int _REFRESHING_ \= 4;
// pull state
private static final int _PULL\_UP\_STATE_ \= 0;
private static final int _PULL\_DOWN\_STATE_ \= 1;
private boolean enablePullTorefresh \= true;
private boolean enablePullLoadMoreDataStatus \= true;
_/\*\*_
_\* last y_ _\*/_ private int mLastMotionY;
_/\*\*_
_\* last x_ _\*/_ private int mLastMotionX;
_/\*\*_
_\* lock_ _\*/_ private boolean mLock;
_/\*\*_
_\* header view_ _\*/_ private View mHeaderView;
_/\*\*_
_\* footer view_ _\*/_ private View mFooterView;
_/\*\*_
_\* list or grid_ _\*/_ private AdapterView<?> mAdapterView;
_/\*\*_
_\* scrollview_ _\*/_ private ScrollView mScrollView;
_/\*\*_
_\* header view height_ _\*/_ private int mHeaderViewHeight;
_/\*\*_
_\* footer view height_ _\*/_ private int mFooterViewHeight;
_/\*\*_
_\* header view image_ _\*/_ private ImageView mHeaderImageView;
_/\*\*_
_\* footer view image_ _\*/_ private ImageView mFooterImageView;
_/\*\*_
_\* header tip text_ _\*/_ private TextView mHeaderTextView;
_/\*\*_
_\* footer tip text_ _\*/_ private TextView mFooterTextView;
_/\*\*_
_\* header refresh time_ _\*/_ private TextView mHeaderUpdateTextView;
_/\*\*_
_\* footer refresh time_ _\*/_ // private TextView mFooterUpdateTextView;
_/\*\*_
_\* header progress bar_ _\*/_ private ProgressBar mHeaderProgressBar;
_/\*\*_
_\* footer progress bar_ _\*/_ private ProgressBar mFooterProgressBar;
_/\*\*_
_\* layout inflater_ _\*/_ private LayoutInflater mInflater;
_/\*\*_
_\* header view current state_ _\*/_ private int mHeaderState;
_/\*\*_
_\* footer view current state_ _\*/_ private int mFooterState;
_/\*\*_
_\* pull state,pull up or pull down;PULL\_UP\_STATE or PULL\_DOWN\_STATE_ _\*/_ private int mPullState;
_/\*\*_
_\* 变为向下的箭头,改变箭头方向_ _\*/_ private RotateAnimation mFlipAnimation;
_/\*\*_
_\* 变为逆向的箭头,旋转_ _\*/_ private RotateAnimation mReverseFlipAnimation;
_/\*\*_
_\* footer refresh listener_ _\*/_ private OnFooterRefreshListener mOnFooterRefreshListener;
_/\*\*_
_\* footer refresh listener_ _\*/_ private OnHeaderRefreshListener mOnHeaderRefreshListener;
_/\*\*_
_\* last update time_ _\*/_ private Context context;
public PullToRefreshView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context \= context;
init();
}
public PullToRefreshView(Context context) {
super(context);
this.context \= context;
init();
}
_/\*\*_
_\* init_ _\*_ _\*_ **_@description_**
_\*/_
private void init() {
// Load all of the animations we need in code rather than through XML
mFlipAnimation \= new RotateAnimation(0, \-180, RotateAnimation._RELATIVE\_TO\_SELF_, 0.5f, RotateAnimation._RELATIVE\_TO\_SELF_, 0.5f);
mFlipAnimation.setInterpolator(new LinearInterpolator());
mFlipAnimation.setDuration(100);
mFlipAnimation.setFillAfter(true);
mReverseFlipAnimation \= new RotateAnimation(-180, 0, RotateAnimation._RELATIVE\_TO\_SELF_, 0.5f, RotateAnimation._RELATIVE\_TO\_SELF_, 0.5f);
mReverseFlipAnimation.setInterpolator(new LinearInterpolator());
mReverseFlipAnimation.setDuration(100);
mReverseFlipAnimation.setFillAfter(true);
mInflater \= LayoutInflater.from(getContext());
// header view 在此添加,保证是第一个添加到linearlayout的最上端
addHeaderView();
}
private void addHeaderView() {
// header view
mHeaderView \= mInflater.inflate(R.layout._refresh\_header_, this, false);
mHeaderImageView \= (ImageView) mHeaderView.findViewById(R.id._pull\_to\_refresh\_image_);
mHeaderTextView \= (TextView) mHeaderView.findViewById(R.id._pull\_to\_refresh\_text_);
mHeaderUpdateTextView \= (TextView) mHeaderView.findViewById(R.id._pull\_to\_refresh\_updated\_at_);
mHeaderProgressBar \= (ProgressBar) mHeaderView.findViewById(R.id._pull\_to\_refresh\_progress_);
// header layout
measureView(mHeaderView);
mHeaderViewHeight \= mHeaderView.getMeasuredHeight();
LinearLayout.LayoutParams params \= new LayoutParams(LayoutParams._MATCH\_PARENT_, LayoutParams._WRAP\_CONTENT_);
// 设置topMargin的值为负的header View高度,即将其隐藏在最上方
params.topMargin \= -(mHeaderViewHeight);
mHeaderView.setLayoutParams(params);
addView(mHeaderView, params);
}
public void setBarColor(int nColor) {
mHeaderView.setBackgroundColor(nColor);
mFooterView.setBackgroundColor(nColor);
}
private void addFooterView() {
// footer view
mFooterView \= mInflater.inflate(R.layout._refresh\_footer_, this, false);
mFooterImageView \= (ImageView) mFooterView.findViewById(R.id._pull\_to\_load\_image_);
mFooterTextView \= (TextView) mFooterView.findViewById(R.id._pull\_to\_load\_text_);
mFooterProgressBar \= (ProgressBar) mFooterView.findViewById(R.id._pull\_to\_load\_progress_);
// footer layout
measureView(mFooterView);
mFooterViewHeight \= mFooterView.getMeasuredHeight();
LayoutParams params \= new LayoutParams(LayoutParams._MATCH\_PARENT_, mFooterViewHeight);
// int top = getHeight();
// params.topMargin // =getHeight();//在这里getHeight()==0,但在onInterceptTouchEvent()方法里getHeight()已经有值了,不再是0; // getHeight()什么时候会赋值,稍候再研究一下 // 由于是线性布局可以直接添加,只要AdapterView的高度是MATCH\_PARENT,那么footer view就会被添加到最后,并隐藏 addView(mFooterView, params);
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
// footer view 在此添加保证添加到linearlayout中的最后
addFooterView();
initContentAdapterView();
}
_/\*\*_
_\* init AdapterView like ListView,GridView and so on;or init ScrollView_ _\*/_ private void initContentAdapterView() {
int count \= getChildCount();
if (count < 3) {
throw new IllegalArgumentException(
"this layout must contain 3 child views,and AdapterView or ScrollView must in the second position!");
}
View view \= null;
for (int i \= 0; i < count \- 1; ++i) {
view \= getChildAt(i);
if (view instanceof AdapterView<?>) {
mAdapterView \= (AdapterView<?>) view;
}
if (view instanceof ScrollView) {
// finish later
mScrollView \= (ScrollView) view;
}
}
if (mAdapterView \== null && mScrollView \== null) {
throw new IllegalArgumentException(
"must contain a AdapterView or ScrollView in this layout!");
}
}
private void measureView(View child) {
ViewGroup.LayoutParams p \= child.getLayoutParams();
if (p \== null) {
p \= new ViewGroup.LayoutParams(ViewGroup.LayoutParams._MATCH\_PARENT_,
ViewGroup.LayoutParams._WRAP\_CONTENT_);
}
int childWidthSpec \= ViewGroup.getChildMeasureSpec(0, 0 \+ 0, p.width);
int lpHeight \= p.height;
int childHeightSpec;
if (lpHeight \> 0) {
childHeightSpec \= MeasureSpec.makeMeasureSpec(lpHeight,
MeasureSpec._EXACTLY_);
} else {
childHeightSpec \= MeasureSpec.makeMeasureSpec(0,
MeasureSpec._UNSPECIFIED_);
}
child.measure(childWidthSpec, childHeightSpec);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent e) {
int y \= (int) e.getRawY();
int x \= (int) e.getRawX();
switch (e.getAction()) {
case MotionEvent._ACTION\_DOWN_:
// 首先拦截down事件,记录y坐标
mLastMotionY \= y;
mLastMotionX \= x;
break; case MotionEvent._ACTION\_MOVE_:
// deltaY > 0 是向下运动,< 0是向上运动
int deltaY \= y \- mLastMotionY;
int deltaX \= x \- mLastMotionX;
if (Math.abs(deltaY) > Math.abs(deltaX) \* 1.5
&& isRefreshViewScroll(deltaY)) {
return true;
}
break;
case MotionEvent._ACTION\_UP_:
case MotionEvent._ACTION\_CANCEL_:
break;
}
return false;
}
/\*
\* 如果在onInterceptTouchEvent()方法中没有拦截(即onInterceptTouchEvent()方法中 return \* false)则由PullToRefreshView 的子View来处理;否则由下面的方法来处理(即由PullToRefreshView自己来处理) \*/ @Override
public boolean onTouchEvent(MotionEvent event) {
if (mLock) {
return true;
}
int y \= (int) event.getRawY();
switch (event.getAction()) {
case MotionEvent._ACTION\_DOWN_:
// onInterceptTouchEvent已经记录
// mLastMotionY = y; break;
case MotionEvent._ACTION\_MOVE_:
int deltaY \= y \- mLastMotionY;
if (mPullState \== _PULL\_DOWN\_STATE_) {
// PullToRefreshView执行下拉
headerPrepareToRefresh(deltaY);
// setHeaderPadding(-mHeaderViewHeight);
} else if (mPullState \== _PULL\_UP\_STATE_) {
// PullToRefreshView执行上拉
footerPrepareToRefresh(deltaY);
}
mLastMotionY \= y;
break; case MotionEvent._ACTION\_UP_:
case MotionEvent._ACTION\_CANCEL_:
int topMargin \= getHeaderTopMargin();
if (mPullState \== _PULL\_DOWN\_STATE_) {
if (topMargin \>= 0) {
// 开始刷新
headerRefreshing();
} else {
// 还没有执行刷新,重新隐藏
setHeaderTopMargin(-mHeaderViewHeight);
}
} else if (mPullState \== _PULL\_UP\_STATE_) {
if (Math.abs(topMargin) >= mHeaderViewHeight
\+ mFooterViewHeight) {
// 开始执行footer 刷新
footerRefreshing();
} else {
// 还没有执行刷新,重新隐藏
setHeaderTopMargin(-mHeaderViewHeight);
}
}
break;
}
return super.onTouchEvent(event);
}
_/\*\*_
_\* 是否应该到了父View,即PullToRefreshView滑动_ _\*_ _\*_ **_@param_** _deltaY_ _, deltaY > 0 是向下运动,< 0是向上运动_
_\*_ **_@return_**
_\*/_
private boolean isRefreshViewScroll(int deltaY) {
if (mHeaderState \== _REFRESHING_ || mFooterState \== _REFRESHING_) {
return false;
}
// 对于ListView和GridView
if (mAdapterView != null) {
// 子view(ListView or GridView)滑动到最顶端
if (deltaY > 0) {
// 判断是否禁用下拉刷新操作
if (!enablePullTorefresh) {
return false;
}
View child \= mAdapterView.getChildAt(0);
if (child \== null) {
// 如果mAdapterView中没有数据,不拦截
mPullState \= _PULL\_DOWN\_STATE_;
return true; }
if (mAdapterView.getFirstVisiblePosition() == 0
&& child.getTop() == 0) {
mPullState \= _PULL\_DOWN\_STATE_;
return true; }
int top \= child.getTop();
int padding \= mAdapterView.getPaddingTop();
if (mAdapterView.getFirstVisiblePosition() == 0
&& Math.abs(top \- padding) <= 11) {// 这里之前用3可以判断,但现在不行,还没找到原因
mPullState \= _PULL\_DOWN\_STATE_;
return true; }
} else if (deltaY < 0) {
// 判断是否禁用上拉加载更多操作
if (!enablePullLoadMoreDataStatus) {
return false;
}
View lastChild \= mAdapterView.getChildAt(mAdapterView
.getChildCount() - 1);
if (lastChild \== null) {
// 如果mAdapterView中没有数据,不拦截
return false;
}
// 最后一个子view的Bottom小于父View的高度说明mAdapterView的数据没有填满父view,
// 等于父View的高度说明mAdapterView已经滑动到最后 if (lastChild.getBottom() <= getHeight()
&& mAdapterView.getLastVisiblePosition() == mAdapterView
.getCount() - 1) {
mPullState \= _PULL\_UP\_STATE_;
return true; }
}
}
// 对于ScrollView
if (mScrollView != null) {
// 子scroll view滑动到最顶端
View child \= mScrollView.getChildAt(0);
if (deltaY > 0 && mScrollView.getScrollY() == 0) {
if (!enablePullTorefresh) {
return false;
}
mPullState \= _PULL\_DOWN\_STATE_;
return true; } else if (deltaY < 0
&& child.getMeasuredHeight() <= getHeight()
+ mScrollView.getScrollY()) {
if (!enablePullLoadMoreDataStatus) {
return false;
}
mPullState \= _PULL\_UP\_STATE_;
return true; }
}
return false;
}
_/\*\*_
_\* header 准备刷新,手指移动过程,还没有释放_ _\*_ _\*_ **_@param_** _deltaY_ _,手指滑动的距离_
_\*/_ private void headerPrepareToRefresh(int deltaY) {
int newTopMargin \= changingHeaderViewTopMargin(deltaY, 0.3f);
// 当header view的topMargin>=0时,说明已经完全显示出来了,修改header view 的提示状态
if (newTopMargin \>= 0 && mHeaderState != _RELEASE\_TO\_REFRESH_) {
mHeaderTextView.setText(R.string._pull\_to\_refresh\_release\_label_);
mHeaderUpdateTextView.setVisibility(View._GONE_);
mHeaderImageView.clearAnimation();
mHeaderImageView.startAnimation(mFlipAnimation);
mHeaderState \= _RELEASE\_TO\_REFRESH_;
} else if (newTopMargin < 0 && newTopMargin \> -mHeaderViewHeight) {// 拖动时没有释放
mHeaderImageView.clearAnimation();
mHeaderImageView.startAnimation(mFlipAnimation);
mHeaderUpdateTextView.setVisibility(View._GONE_);
// mHeaderImageView.
mHeaderTextView.setText(R.string._pull\_to\_refresh\_pull\_label_);
mHeaderState \= _PULL\_TO\_REFRESH_;
}
}
_/\*\*_
_\* footer 准备刷新,手指移动过程,还没有释放 移动footer view高度同样和移动header view_ _\* 高度是一样,都是通过修改header view的topmargin的值来达到_ _\*_ _\*_ **_@param_** _deltaY_ _,手指滑动的距离_
_\*/_ private void footerPrepareToRefresh(int deltaY) {
int newTopMargin \= changingHeaderViewTopMargin(deltaY, 1.0f);
// 如果header view topMargin 的绝对值大于或等于header + footer 的高度
// 说明footer view 完全显示出来了,修改footer view 的提示状态 if (Math.abs(newTopMargin) >= (mHeaderViewHeight \+ mFooterViewHeight)
&& mFooterState != _RELEASE\_TO\_REFRESH_) {
mFooterTextView
.setText(R.string._pull\_to\_refresh\_footer\_release\_label_);
mFooterImageView.clearAnimation();
mFooterImageView.startAnimation(mFlipAnimation);
mFooterState \= _RELEASE\_TO\_REFRESH_;
} else if (Math.abs(newTopMargin) < (mHeaderViewHeight \+ mFooterViewHeight)) {
mFooterImageView.clearAnimation();
mFooterImageView.startAnimation(mFlipAnimation);
mFooterTextView.setText(R.string._pull\_to\_refresh\_footer\_pull\_label_);
mFooterState \= _PULL\_TO\_REFRESH_;
}
}
_/\*\*_
_\* 修改Header view top margin的值_ _\*_ _\*_ **_@param_** _deltaY_
_\*_ **_@description_**
_\*/_
private int changingHeaderViewTopMargin(int deltaY, float percentage) {
LayoutParams params \= (LayoutParams) mHeaderView.getLayoutParams();
float newTopMargin \= params.topMargin \+ deltaY \* percentage;
// 这里对上拉做一下限制,因为当前上拉后然后不释放手指直接下拉,会把下拉刷新给触发了,感谢网友yufengzungzhe的指出
// 表示如果是在上拉后一段距离,然后直接下拉 if (deltaY > 0 && mPullState \== _PULL\_UP\_STATE_ && Math.abs(params.topMargin) <= mHeaderViewHeight) {
return params.topMargin;
}
// 同样地,对下拉做一下限制,避免出现跟上拉操作时一样的bug
if (deltaY < 0 && mPullState \== _PULL\_DOWN\_STATE_ && Math.abs(params.topMargin) >= mHeaderViewHeight) {
return params.topMargin;
}
params.topMargin \= (int) newTopMargin;
mHeaderView.setLayoutParams(params);
invalidate();
return params.topMargin;
}
_/\*\*_
_\* header refreshing_ _\*/_ public void headerRefreshing() {
mHeaderState \= _REFRESHING_;
setHeaderTopMargin(0);
mHeaderImageView.setVisibility(View._GONE_);
mHeaderImageView.clearAnimation();
mHeaderImageView.setImageDrawable(null);
mHeaderProgressBar.setVisibility(View._VISIBLE_);
mHeaderTextView.setText(R.string._pull\_to\_refresh\_refreshing\_label_);
if (!TextUtils.isEmpty(mHeaderUpdateTextView.getText().toString().trim()))
mHeaderUpdateTextView.setVisibility(View._VISIBLE_);
if (mOnHeaderRefreshListener != null) {
mOnHeaderRefreshListener.onHeaderRefresh(this);
}
nRefreshingType \= _REFRESHING\_TYPE\_HEADER_;
}
_/\*\*_
_\* footer refreshing_ _\*/_ private void footerRefreshing() {
mFooterState \= _REFRESHING_;
int top \= mHeaderViewHeight \+ mFooterViewHeight;
setHeaderTopMargin(-top);
mFooterImageView.setVisibility(View._GONE_);
mFooterImageView.clearAnimation();
mFooterImageView.setImageDrawable(null);
mFooterProgressBar.setVisibility(View._VISIBLE_);
mFooterTextView
.setText(R.string._pull\_to\_refresh\_footer\_refreshing\_label_);
if (mOnFooterRefreshListener != null) {
mOnFooterRefreshListener.onFooterRefresh(this);
}
nRefreshingType \= _REFRESHING\_TYPE\_FOOTER_;
}
_/\*\*_
_\* 设置header view 的topMargin的值_ _\*_ _\*_ **_@param_** _topMargin_ _,为0时,说明header view 刚好完全显示出来; 为-mHeaderViewHeight时,说明完全隐藏了_
_\*_ **_@description_**
_\*/_
private void setHeaderTopMargin(int topMargin) {
LayoutParams params \= (LayoutParams) mHeaderView.getLayoutParams();
params.topMargin \= topMargin;
mHeaderView.setLayoutParams(params);
invalidate();
}
_/\*\*_
_\* header view 完成更新后恢复初始状态_ _\*/_ private void onHeaderRefreshComplete() {
setHeaderTopMargin(-mHeaderViewHeight);
mHeaderImageView.setVisibility(View._VISIBLE_);
mHeaderImageView.setImageResource(R.drawable._ic\_pulltorefresh\_arrow_);
mHeaderTextView.setText(R.string._pull\_to\_refresh\_pull\_label_);
mHeaderProgressBar.setVisibility(View._GONE_);
mHeaderState \= _PULL\_TO\_REFRESH_;
long between \= Calendar.getInstance().getTimeInMillis() - System.currentTimeMillis();
setLastUpdated(String.format(context
.getString(R.string._pull\_to\_refresh\_refresh\_time\_label_), new SimpleDateFormat((between \>= 86400000 ? "MM-dd" : "HH:mm")).format(System.currentTimeMillis())));
}
_/\*\*_
_\* Resets the list to a normal state after a refresh._ _\*_ _\*_ **_@param_** _lastUpdated_ _Last updated at._
_\*/_ public void onHeaderRefreshComplete(CharSequence lastUpdated) {
setLastUpdated(lastUpdated);
onHeaderRefreshComplete();
}
_/\*\*_
_\* footer view 完成更新后恢复初始状态_ _\*/_ private void onFooterRefreshComplete() {
setHeaderTopMargin(-mHeaderViewHeight);
mFooterImageView.setVisibility(View._VISIBLE_);
mFooterImageView.setImageResource(R.drawable._ic\_pulltorefresh\_arrow\_up_);
mFooterTextView.setText(R.string._pull\_to\_refresh\_footer\_pull\_label_);
mFooterProgressBar.setVisibility(View._GONE_);
// mHeaderUpdateTextView.setText("");
mFooterState \= _PULL\_TO\_REFRESH_;
}
_/\*\*_
_\* footer view 完成更新后恢复初始状态_ _\*/_ public void onFooterRefreshComplete(int size) {
if (size > 0) {
mFooterView.setVisibility(View._VISIBLE_);
} else {
mFooterView.setVisibility(View._GONE_);
}
setHeaderTopMargin(-mHeaderViewHeight);
mFooterImageView.setVisibility(View._VISIBLE_);
mFooterImageView.setImageResource(R.drawable._ic\_pulltorefresh\_arrow\_up_);
mFooterTextView.setText(R.string._pull\_to\_refresh\_footer\_pull\_label_);
mFooterProgressBar.setVisibility(View._GONE_);
// mHeaderUpdateTextView.setText("");
mFooterState \= _PULL\_TO\_REFRESH_;
}
_/\*\*_
_\* 完成更新后恢复初始状态_ _\*/_ public void setRefreshComplete() {
switch (nRefreshingType) {
case _REFRESHING\_TYPE\_HEADER_:
onHeaderRefreshComplete();
break; case _REFRESHING\_TYPE\_FOOTER_:
onFooterRefreshComplete();
break;
default:
break;
}
}
_/\*\*_
_\* Set a text to represent when the list was last updated._ _\*_ _\*_ **_@param_** _lastUpdated_ _Last updated at._
_\*/_ public void setLastUpdated(CharSequence lastUpdated) {
if (lastUpdated != null) {
mHeaderUpdateTextView.setVisibility(View._VISIBLE_);
mHeaderUpdateTextView.setText(lastUpdated);
} else {
mHeaderUpdateTextView.setVisibility(View._GONE_);
}
}
_/\*\*_
_\* 获取当前header view 的topMargin_ _\*_ _\*_ **_@description_**
_\*/_
private int getHeaderTopMargin() {
LayoutParams params \= (LayoutParams) mHeaderView.getLayoutParams();
return params.topMargin;
}
// /\*\*
// \* lock // \* // \*/ // private void lock() { // mLock = true; // } // // /\*\* // \* unlock // \* // \*/ // private void unlock() { // mLock = false; // }
_/\*\*_
_\* set headerRefreshListener_ _\*_ _\*_ **_@param_** _headerRefreshListener_
_\*_ **_@description_**
_\*/_
public void setOnHeaderRefreshListener(
OnHeaderRefreshListener headerRefreshListener) {
mOnHeaderRefreshListener \= headerRefreshListener;
}
public void setOnFooterRefreshListener(
OnFooterRefreshListener footerRefreshListener) {
mOnFooterRefreshListener \= footerRefreshListener;
}
_/\*\*_
_\* Interface definition for a callback to be invoked when list/grid footer_ _\* view should be refreshed._ _\*/_ public interface OnFooterRefreshListener {
public void onFooterRefresh(PullToRefreshView view);
}
_/\*\*_
_\* Interface definition for a callback to be invoked when list/grid header_ _\* view should be refreshed._ _\*/_ public interface OnHeaderRefreshListener {
public void onHeaderRefresh(PullToRefreshView view);
}
public boolean isEnablePullTorefresh() {
return enablePullTorefresh;
}
public void setEnablePullTorefresh(boolean enablePullTorefresh) {
this.enablePullTorefresh \= enablePullTorefresh;
}
public boolean isEnablePullLoadMoreDataStatus() {
return enablePullLoadMoreDataStatus;
}
public void setEnablePullLoadMoreDataStatus(
boolean enablePullLoadMoreDataStatus) {
this.enablePullLoadMoreDataStatus \= enablePullLoadMoreDataStatus;
}
}
在fragment使用完整Class
public class GongYinFragment extends BaseFragment implements PullToRefreshView.OnFooterRefreshListener,PullToRefreshView.OnHeaderRefreshListener{
@BindView(R.id._fragment\_my\_all\_crowd\_funding\_recycler\_view_)
RecyclerView fragmentMyAllCrowdFundingRecyclerView;
@BindView(R.id._p2rv_)
PullToRefreshView p2rv;
@BindView(R.id._sosli_)
LinearLayout sosli;
@BindView(R.id._noticeBoard_)
MarqueeView noticeBoard;
@BindView(R.id._kongli_)
LinearLayout kongli;
private List<GongXuEntity> mGongXuEntities \= new ArrayList<>();
private AllGongXuAdapter adapter;
private SubscriberOnNextListener getBusinessSearchListOnNextListener;
private IntentFilter intentFilter;
private LocalBroadcastManager localBroadcastManager;
private int ab \= 1,pageCount;// 当前页面,从0开始计数
private String detail;
public Unbinder unbinder;
private More\_LoadDialog mMore\_loadDialog;
private List<HomePageAnnouncementEntity> mStrings\=new ArrayList<>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public int getViewLayout() {
return R.layout._allgongxufragmentla_;
}
@Override
protected void initView(Bundle savedInstanceState) {
initRecyclerView();
mMore\_loadDialog \= new More\_LoadDialog(getContext());
// sosli.setVisibility(View.GONE);
getMyBusinessDistrict(1);
initNoticeBoard();
p2rv.setOnFooterRefreshListener(this);
p2rv.setOnHeaderRefreshListener(this);
}
private void initNoticeBoard() {
String url \= Url._homePageAnnouncement_;
RequestParams params \= new RequestParams();
/\*1:首页广告位 2:供需成功案例\*/
params.put("announcementType", 2);
doHttpGet(url, params, new RequestCallback(){
@Override
public void onFailure(int i, Header\[\] headers, String s, Throwable throwable) {
// Toasty.error(getActivity(), “网络连接异常”, Toast.LENGTH_SHORT, true).show();
}
@Override
public void onSuccess(int i, Header\[\] headers, String s) {
try {
// Log.v(“Lgq”,“w d z HomeFragment====”+s);
JSONObject object \= new JSONObject(s);
if (object.getString("success").equals("true")) {
mStrings.addAll(FastJsonUtils.getObjectsList(object.getString("data"), HomePageAnnouncementEntity.class));
ArrayList<String> notices \= new ArrayList<String>();
for (HomePageAnnouncementEntity str: mStrings) {
notices.add(str.getAnnouncementTitle());
}
noticeBoard.startWithList(notices, R.anim._anim\_bottom\_in_, R.anim._anim\_top\_out_);
noticeBoard.setOnItemClickListener(new MarqueeView.OnItemClickListener() {
@Override
public void onItemClick(int position, TextView textView) {
String url \= mStrings.get(position).getAnnouncementContent();
if (url.startsWith("http")) {
startActivity(new Intent(getActivity(), HomeADactivity.class).putExtra("url", url));
}
}
});
}
} catch (JSONException e) {
// Toast.makeText(getActivity(), “数据解析出错”, Toast.LENGTH_SHORT).show();
Logger.d("json 解析出错");
}
}
});
}
private void getMyBusinessDistrict(int pageNumber) {
String url \= Url._getgongxu_;
RequestParams params \= new RequestParams();
mMore\_loadDialog.show();
params.put("pageNumber", pageNumber);
params.put("supplyDemand", 0);
params.put("status", 1);
doHttpGet(url, params, new RequestCallback() {
@Override
public void onFailure(int i, Header\[\] headers, String s, Throwable throwable) {
Toast.makeText(getContext(), "网络连接异常", Toast._LENGTH\_SHORT_).show();
mMore\_loadDialog.dismiss();
p2rv.setRefreshComplete();
}
@Override
public void onSuccess(int i, Header\[\] headers, String s) {
mMore\_loadDialog.dismiss();
p2rv.setRefreshComplete();
try {
JSONObject object \= new JSONObject(s);
pageCount \= object.getInt("pageCount");
if (object.getString("success").equals("true")) {
JSONArray jsonArray \= object.getJSONArray("data");
if (jsonArray.length()==0){
kongli.setVisibility(View._VISIBLE_);
}
for (int a \= 0; a < jsonArray.length(); a++) {
JSONObject businessObject \= jsonArray.getJSONObject(a);
String supplyDemandId \= businessObject.getString("supplyDemandId");//商圈id
String image1 \= businessObject.getString("image1");//图片
String image11 \= Url._img\_domain_ \+ image1+Url._imageStyle640x640_;
String image2 \= businessObject.getString("image2");//图片
String image22 \= Url._img\_domain_ \+ image2+Url._imageStyle640x640_;
String image3 \= businessObject.getString("image3");//图片
String image33 \= Url._img\_domain_ \+ image3+Url._imageStyle640x640_;
String content \= businessObject.getString("content");//商圈名称
String createDt \= businessObject.getString("createDt");
String epId \= businessObject.getString("epId");
String supplyDemand \= businessObject.getString("supplyDemand");
String userId \= businessObject.getString("userId");
String title \= businessObject.getString("title");
String address \= businessObject.getString("address");
JSONObject twoob\=new JSONObject(address);
String city \= twoob.getString("city");
// Log.v(“Lgq”,“… " +image11+” … “+image22+” 。。。 "+image33);
GongXuEntity entity \= new GongXuEntity();
entity.setImage1(TextUtil.isEmpty(image1)?image1:image11);
entity.setImage2(TextUtil.isEmpty(image2)?image2:image22);
entity.setImage3(TextUtil.isEmpty(image3)?image3:image33);
entity.setContent(content);
entity.setCreateDt(createDt);
entity.setEpId(epId);
entity.setSupplyDemandId(supplyDemandId);
entity.setSupplyDemand(supplyDemand);
entity.setUserId(userId);
entity.setTitle(title);
entity.setCity(city);
mGongXuEntities.add(entity);
分享读者
作者2013年java转到Android开发,在小厂待过,也去过华为,OPPO等大厂待过,18年四月份进了阿里一直到现在。
被人面试过,也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长,而且极易碰到天花板技术停滞不前!
我们整理了一份阿里P7级别的Android架构师全套学习资料,特别适合有3-5年以上经验的小伙伴深入学习提升。
主要包括腾讯,以及字节跳动,阿里,华为,小米,等一线互联网公司主流架构技术。
如果你觉得自己学习效率低,缺乏正确的指导,可以一起学习交流!
我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。
35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。
;
JSONObject twoob\=new JSONObject(address);
String city \= twoob.getString("city");
// Log.v(“Lgq”,“… " +image11+” … “+image22+” 。。。 "+image33);
GongXuEntity entity \= new GongXuEntity();
entity.setImage1(TextUtil.isEmpty(image1)?image1:image11);
entity.setImage2(TextUtil.isEmpty(image2)?image2:image22);
entity.setImage3(TextUtil.isEmpty(image3)?image3:image33);
entity.setContent(content);
entity.setCreateDt(createDt);
entity.setEpId(epId);
entity.setSupplyDemandId(supplyDemandId);
entity.setSupplyDemand(supplyDemand);
entity.setUserId(userId);
entity.setTitle(title);
entity.setCity(city);
mGongXuEntities.add(entity);
分享读者
作者2013年java转到Android开发,在小厂待过,也去过华为,OPPO等大厂待过,18年四月份进了阿里一直到现在。
被人面试过,也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长,而且极易碰到天花板技术停滞不前!
我们整理了一份阿里P7级别的Android架构师全套学习资料,特别适合有3-5年以上经验的小伙伴深入学习提升。
主要包括腾讯,以及字节跳动,阿里,华为,小米,等一线互联网公司主流架构技术。
[外链图片转存中…(img-G6FlL8cz-1719385236082)]
如果你觉得自己学习效率低,缺乏正确的指导,可以一起学习交流!
我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。
35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。