android view滑动到顶部并固定在顶部

                        <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年以上经验的小伙伴深入学习提升。

主要包括腾讯,以及字节跳动,阿里,华为,小米,等一线互联网公司主流架构技术。

腾讯T3架构师学习专题资料

如果你觉得自己学习效率低,缺乏正确的指导,可以一起学习交流!

我们致力打造一个平等,高质量的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岁后的你只会比周围的人更值钱。

  • 13
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值