仿京东listview刷新动画

1.概述

本篇改造自XListView,融合了自己的想法。


一、自定义listView

直接上xlistView的代码


public class XListView extends ListView implements OnScrollListener {  
  
    private float mLastY = -1; // save event y  
    private Scroller mScroller; // used for scroll back  
    private OnScrollListener mScrollListener; // user's scroll listener  
    // the interface to trigger refresh and load more.  
    private IXListViewListener mListViewListener;  
    // -- header view  
    private XListViewHeader mHeaderView;  
    // header view content, use it to calculate the Header's height. And hide it  
    // when disable pull refresh.  
    private RelativeLayout mHeaderViewContent;  
    private TextView mHeaderTimeView;  
    private int mHeaderViewHeight; // header view's height  
    private boolean mEnablePullRefresh = true;  
    private boolean mPullRefreshing = false; // is refreashing.  
    // -- footer view  
    private XListViewFooter mFooterView;  
    private boolean mEnablePullLoad;  
    private boolean mPullLoading;  
    private boolean mIsFooterReady = false;  
  
    // total list items, used to detect is at the bottom of listview.  
    private int mTotalItemCount;  
  
    // for mScroller, scroll back from header or footer.  
    private int mScrollBack;  
    private final static int SCROLLBACK_HEADER = 0;  
    private final static int SCROLLBACK_FOOTER = 1;  
  
    private final static int SCROLL_DURATION = 400; // scroll back duration  
    private final static int PULL_LOAD_MORE_DELTA = 50; // when pull up >= 50px  
                                                        // at bottom, trigger  
                                                        // load more.  
    private final static float OFFSET_RADIO = 1.8f; // support iOS like pull  
                                                    // feature.  
    private int slidePosition, preSlidePosition;  
    private int downY;  
    private int downX;  
    public static View itemView, preItemView;  
//  private Scroller scroller;  
    private static final int SNAP_VELOCITY = 600;  
    private VelocityTracker velocityTracker;  
    public static boolean isSlide = false;  
    private boolean isResponse = true;  
    public static boolean isObstruct = true;  
    private int mTouchSlop;  
    private RemoveListener mRemoveListener;  
  
    private static Animation scaleHideAnimation;  
    private static Animation scaleShowAnimation;  
      
      
    private ImageView mHeadImageView;  
    private float mFloat = 0.0f;  
    /** 
     * @param context 
     */  
  
    public XListView(Context context) {  
        super(context);  
        initWithContext(context);  
        mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();  
    }  
  
    public XListView(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        initWithContext(context);  
        mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();  
    }  
  
    public XListView(Context context, AttributeSet attrs, int defStyle) {  
        super(context, attrs, defStyle);  
//      mScroller = new Scroller(context, new DecelerateInterpolator());  
        initWithContext(context);  
        mTouchSlop = ViewConfiguration.get(getContext()).getScaledTouchSlop();  
    }  
  
    private void initWithContext(Context context) {  
        mScroller = new Scroller(context, new DecelerateInterpolator());  
        // XListView need the scroll event, and it will dispatch the event to  
        // user's listener (as a proxy).  
        super.setOnScrollListener(this);  
  
        // init header view  
        mHeaderView = new XListViewHeader(context);  
        mHeaderViewContent = (RelativeLayout) mHeaderView  
                .findViewById(R.id.xlistview_header_content);  
        mHeaderTimeView = (TextView) mHeaderView  
                .findViewById(R.id.xlistview_header_time);  
        mHeadImageView = (ImageView)mHeaderView.findViewById(R.id.  
                xlistview_header_arrow);  
        addHeaderView(mHeaderView);  
  
        // init footer view  
        mFooterView = new XListViewFooter(context);  
  
        // init header height  
        mHeaderView.getViewTreeObserver().addOnGlobalLayoutListener(  
                new OnGlobalLayoutListener() {  
                    @Override  
                    public void onGlobalLayout() {  
                        mHeaderViewHeight = mHeaderViewContent.getHeight();  
                        getViewTreeObserver()  
                                .removeGlobalOnLayoutListener(this);  
                    }  
                });  
    }  
  
    @Override  
    public void setAdapter(ListAdapter adapter) {  
        // make sure XListViewFooter is the last footer view, and only add once.  
        if (mIsFooterReady == false) {  
            mIsFooterReady = true;  
            addFooterView(mFooterView);  
        }  
        super.setAdapter(adapter);  
    }  
  
    /** 
     * enable or disable pull down refresh feature. 
     *  
     * @param enable 
     */  
    public void setPullRefreshEnable(boolean enable) {  
        mEnablePullRefresh = enable;  
        if (!mEnablePullRefresh) { // disable, hide the content  
            mHeaderViewContent.setVisibility(View.INVISIBLE);  
        } else {  
            mHeaderViewContent.setVisibility(View.VISIBLE);  
        }  
    }  
  
    /** 
     * enable or disable pull up load more feature. 
     *  
     * @param enable 
     */  
    public void setPullLoadEnable(boolean enable) {  
        mEnablePullLoad = enable;  
        if (!mEnablePullLoad) {  
            mFooterView.hide();  
            mFooterView.setOnClickListener(null);  
        } else {  
            mPullLoading = false;  
            mFooterView.show();  
            mFooterView.setState(XListViewFooter.STATE_NORMAL);  
            // both "pull up" and "click" will invoke load more.  
            mFooterView.setOnClickListener(new OnClickListener() {  
                @Override  
                public void onClick(View v) {  
                    startLoadMore();  
                }  
            });  
        }  
    }  
  
    /** 
     * stop refresh, reset header view. 
     */  
    public void stopRefresh() {  
        if (mPullRefreshing == true) {  
            mPullRefreshing = false;  
            resetHeaderHeight();  
        }  
    }  
  
    /** 
     * stop load more, reset footer view. 
     */  
    public void stopLoadMore() {  
        if (mPullLoading == true) {  
            mPullLoading = false;  
            mFooterView.setState(XListViewFooter.STATE_NORMAL);  
        }  
    }  
  
    /** 
     * set last refresh time 
     *  
     * @param time 
     */  
    public void setRefreshTime(String time) {  
        mHeaderTimeView.setText(time);  
    }  
  
    private void invokeOnScrolling() {  
        if (mScrollListener instanceof OnXScrollListener) {  
            OnXScrollListener l = (OnXScrollListener) mScrollListener;  
            l.onXScrolling(this);  
        }  
    }  
  
    private void updateHeaderHeight(float delta) {  
  
        mHeaderView.setVisiableHeight((int) delta  
                + mHeaderView.getVisiableHeight());  
        if (mEnablePullRefresh && !mPullRefreshing) {   
            if (mHeaderView.getVisiableHeight() > mHeaderViewHeight) {  
                mHeaderView.setState(XListViewHeader.STATE_READY);  
            } else {  
                mHeaderView.setState(XListViewHeader.STATE_NORMAL);  
                /* 
                 * 这里可以定义头部显示出来的效果 
                 */  
                float f = mHeaderView.getVisiableHeight()*1.0f/mHeaderViewHeight*1.0f;  
                final ScaleAnimation animation =new ScaleAnimation(mFloat, f, mFloat, f,   
                Animation.RELATIVE_TO_SELF, 0.8f, Animation.RELATIVE_TO_SELF, 0.8f);  
                animation.setDuration(100);  
                animation.setFillAfter(true);  
                mHeadImageView.startAnimation(animation);  
                mFloat = f;  
            }  
        }  
        setSelection(0); // scroll to top each time  
    }  
  
    /** 
     * reset header view's height.重置 
     */  
    private void resetHeaderHeight() {  
        int height = mHeaderView.getVisiableHeight();  
        if (height == 0) // not visible.  
            return;  
        // refreshing and header isn't shown fully. do nothing.  
        if (mPullRefreshing && height <= mHeaderViewHeight) {  
            return;  
        }  
        int finalHeight = 0; // default: scroll back to dismiss header.  
        // is refreshing, just scroll back to show all the header.  
        if (mPullRefreshing && height > mHeaderViewHeight) {  
            finalHeight = mHeaderViewHeight;  
        }  
        mScrollBack = SCROLLBACK_HEADER;  
        mScroller.startScroll(0, height, 0, finalHeight - height,  
                SCROLL_DURATION);  
        // trigger computeScroll  
        invalidate();  
    }  
  
    private void updateFooterHeight(float delta) {  
        int height = mFooterView.getBottomMargin() + (int) delta;  
        if (mEnablePullLoad && !mPullLoading) {  
            if (height > PULL_LOAD_MORE_DELTA) { // height enough to invoke load  
                                                    // more.  
                mFooterView.setState(XListViewFooter.STATE_READY);  
            } else {  
                mFooterView.setState(XListViewFooter.STATE_NORMAL);  
            }  
        }  
        mFooterView.setBottomMargin(height);  
  
        // setSelection(mTotalItemCount - 1); // scroll to bottom  
    }  
  
    private void resetFooterHeight() {  
        int bottomMargin = mFooterView.getBottomMargin();  
        if (bottomMargin > 0) {  
            mScrollBack = SCROLLBACK_FOOTER;  
            mScroller.startScroll(0, bottomMargin, 0, -bottomMargin,  
                    SCROLL_DURATION);  
            invalidate();  
        }  
    }  
  
    private void startLoadMore() {  
        mPullLoading = true;  
        mFooterView.setState(XListViewFooter.STATE_LOADING);  
        if (mListViewListener != null) {  
            mListViewListener.onLoadMore();  
        }  
    }  
      
    //RemoveListener  
  
    public void setRemoveListener(RemoveListener removeListener) {  
        this.mRemoveListener = removeListener;  
    }  
      
      
    public boolean dispatchTouchEvent(MotionEvent event) {  
        switch (event.getAction()) {  
        case MotionEvent.ACTION_DOWN: {  
  
            Log.e("lg", "dispatchTouchEvent ACTION_DOWN isSlide1111 = " + isSlide);  
  
            addVelocityTracker(event);  
  
            downX = (int) event.getX();  
            downY = (int) event.getY();  
  
            slidePosition = pointToPosition(downX, downY);  
  
            if (slidePosition == AdapterView.INVALID_POSITION) {  
                return super.dispatchTouchEvent(event);  
            }  
  
            if (preItemView != null && preItemView.findViewById(R.id.tv_coating).getVisibility() == View.GONE) {  
                itemView = preItemView;  
                slidePosition = preSlidePosition;  
            } else {  
                itemView = getChildAt(slidePosition - getFirstVisiblePosition());  
                preItemView = itemView;  
                preSlidePosition = slidePosition;  
            }  
  
            break;  
        }  
        case MotionEvent.ACTION_MOVE: {  
            if (Math.abs(getScrollVelocity()) > SNAP_VELOCITY || (Math.abs(event.getX() - downX) > mTouchSlop && Math.abs(event.getY() - downY) < mTouchSlop)) {  
                isSlide = true;  
            }  
            break;  
        }  
        case MotionEvent.ACTION_UP:  
            recycleVelocityTracker();  
            isObstruct = true;  
            break;  
        }  
  
        return super.dispatchTouchEvent(event);  
    }  
      
    public boolean onInterceptTouchEvent(MotionEvent ev) {  
        switch (ev.getAction()) {  
        case MotionEvent.ACTION_MOVE:  
            if (itemView.findViewById(R.id.tv_coating).getVisibility() == View.VISIBLE) {  
                isSlide = false;  
            } else {  
                isSlide = true;  
            }  
            break;  
  
        default:  
            break;  
        }  
        return super.onInterceptTouchEvent(ev);  
    }  
      
      
    //dispatchTouchEvent ACTION_DOWN isSlide  
  
//  @Override  dispatchTouchEvent  
    public boolean onTouchEvent(MotionEvent ev) {  
          
      
        if (isSlide && slidePosition != AdapterView.INVALID_POSITION) {  
            addVelocityTracker(ev);  
            final int action = ev.getAction();  
            switch (action) {  
            case MotionEvent.ACTION_MOVE:  
                if (isObstruct) {  
  
                    if (itemView.findViewById(R.id.tv_coating).getVisibility() == View.VISIBLE && isResponse == true) {  
  
                        scaleHideAnimation = new ScaleAnimation(1.0f, 0.0f, 1.0f, 1.0f);  
                        scaleHideAnimation.setDuration(250);  
                        scaleHideAnimation.setAnimationListener(new AnimationListener() {  
  
                            public void onAnimationStart(Animation animation) {  
                                isResponse = false;  
                                isObstruct = false;  
                            }  
  
                            public void onAnimationRepeat(Animation animation) {  
  
                            }  
  
                            public void onAnimationEnd(Animation animation) {  
                                isResponse = true;  
                                itemView.findViewById(R.id.tv_coating).setVisibility(View.GONE);  
                                itemView.findViewById(R.id.tv_functions).setClickable(true);  
                                itemView.findViewById(R.id.tv_functions).setOnClickListener(new OnClickListener() {  
  
                                    public void onClick(View v) {  
                                        mRemoveListener.removeItem(slidePosition);  
                                    }  
  
                                });  
  
                            }  
                        });  
  
                        itemView.findViewById(R.id.tv_coating).startAnimation(scaleHideAnimation);  
  
                    } else if (itemView.findViewById(R.id.tv_coating).getVisibility() == View.GONE && isResponse == true) {  
  
                        scaleShowAnimation = new ScaleAnimation(0.0f, 1.0f, 1.0f, 1.0f);  
                        scaleShowAnimation.setDuration(250);  
                        scaleShowAnimation.setAnimationListener(new AnimationListener() {  
  
                            public void onAnimationStart(Animation animation) {  
                                isResponse = false;  
                                isObstruct = false;  
                            }  
  
                            public void onAnimationRepeat(Animation animation) {  
  
                            }  
  
                            public void onAnimationEnd(Animation animation) {  
                                isSlide = false;  
                                isResponse = true;  
                                itemView.findViewById(R.id.tv_coating).setVisibility(View.VISIBLE);  
                            }  
                        });  
  
                        itemView.findViewById(R.id.tv_coating).startAnimation(scaleShowAnimation);  
                    }  
                }  
                break;  
            case MotionEvent.ACTION_UP:  
                isObstruct = true;  
                recycleVelocityTracker();  
                isSlide = true;  
                break;  
            }  
            return true;  
        }  
          
        if (mLastY == -1) {  
            mLastY = ev.getRawY();  
        }  
  
        switch (ev.getAction()) {  
        case MotionEvent.ACTION_DOWN:  
            mLastY = ev.getRawY();  
            break;  
        case MotionEvent.ACTION_MOVE:  
            final float deltaY = ev.getRawY() - mLastY;  
            mLastY = ev.getRawY();  
            if (getFirstVisiblePosition() == 0  
                    && (mHeaderView.getVisiableHeight() > 0 || deltaY > 0)) {  
                // the first item is showing, header has shown or pull down.  
                updateHeaderHeight(deltaY / OFFSET_RADIO);  
                invokeOnScrolling();  
            } else if (getLastVisiblePosition() == mTotalItemCount - 1  
                    && (mFooterView.getBottomMargin() > 0 || deltaY < 0)) {  
                // last item, already pulled up or want to pull up.  
                updateFooterHeight(-deltaY / OFFSET_RADIO);  
            }  
            break;  
        default:  
            mLastY = -1; // reset  
            if (getFirstVisiblePosition() == 0) {  
                // invoke refresh  
                if (mEnablePullRefresh  
                        && mHeaderView.getVisiableHeight() > mHeaderViewHeight) {  
                    mPullRefreshing = true;  
                    mHeaderView.setState(XListViewHeader.STATE_REFRESHING);  
                    if (mListViewListener != null) {  
                        mListViewListener.onRefresh();  
                    }  
                }  
                resetHeaderHeight();  
            } else if (getLastVisiblePosition() == mTotalItemCount - 1) {  
                // invoke load more.  
                if (mEnablePullLoad  
                        && mFooterView.getBottomMargin() > PULL_LOAD_MORE_DELTA  
                        && !mPullLoading) {  
                    startLoadMore();  
                }  
                resetFooterHeight();  
            }  
            break;  
        }  
          
        return super.onTouchEvent(ev);  
//      return super.onTouchEvent(ev);  
    }  
  
    @Override  
    public void computeScroll() {  
        if (mScroller.computeScrollOffset()) {  
            if (mScrollBack == SCROLLBACK_HEADER) {  
                mHeaderView.setVisiableHeight(mScroller.getCurrY());  
            } else {  
                mFooterView.setBottomMargin(mScroller.getCurrY());  
            }  
            postInvalidate();  
            invokeOnScrolling();  
              
            if (mScroller.isFinished()) {  
                if (mRemoveListener == null) {  
                    throw new NullPointerException("RemoveListener is null, we should called setRemoveListener()");  
                }  
  
                itemView.scrollTo(0, 0);  
            }  
        }  
        super.computeScroll();  
    }  
      
      
    //addVelocityTracker  
      
    private void addVelocityTracker(MotionEvent event) {  
        if (velocityTracker == null) {  
            velocityTracker = VelocityTracker.obtain();  
        }  
        velocityTracker.addMovement(event);  
    }  
  
    private void recycleVelocityTracker() {  
        if (velocityTracker != null) {  
            velocityTracker.recycle();  
            velocityTracker = null;  
        }  
    }  
      
    private int getScrollVelocity() {  
        velocityTracker.computeCurrentVelocity(1000);  
        int velocity = (int) velocityTracker.getXVelocity();  
        return velocity;  
    }  
  
    public interface RemoveListener {  
        public void removeItem(int position);  
    }  
      
      
  
    @Override  
    public void setOnScrollListener(OnScrollListener l) {  
        mScrollListener = l;  
    }  
  
    @Override  
    public void onScrollStateChanged(AbsListView view, int scrollState) {  
        if (mScrollListener != null) {  
            mScrollListener.onScrollStateChanged(view, scrollState);  
        }  
    }  
  
    @Override  
    public void onScroll(AbsListView view, int firstVisibleItem,  
            int visibleItemCount, int totalItemCount) {  
        // send to user's listener  
        mTotalItemCount = totalItemCount;  
        if (mScrollListener != null) {  
            mScrollListener.onScroll(view, firstVisibleItem, visibleItemCount,  
                    totalItemCount);  
        }  
    }  
      
      
      
      
      
  
    public void setXListViewListener(IXListViewListener l) {  
        mListViewListener = l;  
    }  
  
    /** 
     * you can listen ListView.OnScrollListener or this one. it will invoke 
     * onXScrolling when header/footer scroll back. 
     */  
    public interface OnXScrollListener extends OnScrollListener {  
        public void onXScrolling(View view);  
    }  
  
    /** 
     * implements this interface to get refresh/load more event. 
     */  
    public interface IXListViewListener {  
        public void onRefresh();  
  
        public void onLoadMore();  
    }  
}  

二、定义listView 的头部,可以配合设计,制作出专属你app的动画


public class XListViewHeader extends LinearLayout {  
    private LinearLayout mContainer;  
    private ImageView mArrowImageView;  
    private TextView mHintTextView;  
    private int mState = STATE_NORMAL;  
  
    public final static int STATE_NORMAL = 0;  
    public final static int STATE_READY = 1;  
    public final static int STATE_REFRESHING = 2;  
  
    private AnimationDrawable drawable;  
      
    public XListViewHeader(Context context) {  
        super(context);  
        initView(context);  
    }  
  
    /** 
     * @param context 
     * @param attrs 
     */  
    public XListViewHeader(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        initView(context);  
    }  
  
    private void initView(Context context) {  
        // 初始情况,设置下拉刷新view高度为0  
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(  
                LayoutParams.FILL_PARENT, 0);  
        mContainer = (LinearLayout) LayoutInflater.from(context).inflate(  
                R.layout.xlistview_header, null);  
        addView(mContainer, lp);  
        setGravity(Gravity.BOTTOM);  
  
        mArrowImageView = (ImageView)findViewById(R.id.xlistview_header_arrow);  
        mHintTextView = (TextView)findViewById(R.id.xlistview_header_hint_textview);  
          
        drawable = (AnimationDrawable) mArrowImageView.getDrawable();  
        //先把动画停止  
        drawable.stop();  
    }  
  
    public void setState(int state) {  
        if (state == mState) return ;  
          
        //分析传过来的状态  
        switch(state){  
        case STATE_NORMAL:  
            /* 
             * 如果传过来的状态是正常,当前状态是准备刷新,则把动画停止 
             */  
            drawable.stop();  
            mHintTextView.setText(R.string.xlistview_header_hint_normal);  
            break;  
        case STATE_READY:  
            /** 
             * 如果传过来的状态是准备刷新,当前状态不是刷新状态,则开始动画 
             */  
            if (mState != STATE_READY) {  
                drawable.start();  
                mHintTextView.setText(R.string.xlistview_header_hint_ready);  
            }  
            break;  
        case STATE_REFRESHING:  
            drawable.start();  
            mHintTextView.setText(R.string.xlistview_header_hint_loading);  
            break;  
            default:  
        }  
          
        mState = state;  
    }  
      
    public void setVisiableHeight(int height) {  
        if (height < 0)  
            height = 0;  
        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mContainer  
                .getLayoutParams();  
        lp.height = height;  
        mContainer.setLayoutParams(lp);  
    }  
  
    public int getVisiableHeight() {  
        return mContainer.getHeight();  
    }  
  
}  

三、定义listview的尾部,可以定义各式各样的进度条,这里我找了一个加载gif的jar包,加载一张gif图片。


public class XListViewFooter extends LinearLayout{  
  
    public final static int STATE_NORMAL = 0;  
    public final static int STATE_READY = 1;  
    public final static int STATE_LOADING = 2;  
  
    private Context mContext;  
  
    private View mContentView;  
    private GifView mProgressBar;  
    private TextView mHintView;  
      
    public XListViewFooter(Context context) {  
        super(context);  
        initView(context);  
    }  
      
    public XListViewFooter(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        initView(context);  
    }  
  
      
    public void setState(int state) {  
        mHintView.setVisibility(View.INVISIBLE);  
        mProgressBar.setVisibility(View.INVISIBLE);  
        mHintView.setVisibility(View.INVISIBLE);  
        if (state == STATE_READY) {  
            mHintView.setVisibility(View.VISIBLE);  
            mHintView.setText(R.string.xlistview_footer_hint_ready);  
        } else if (state == STATE_LOADING) {  
            mProgressBar.setVisibility(View.VISIBLE);  
        } else {  
            mHintView.setVisibility(View.VISIBLE);  
            mHintView.setText(R.string.xlistview_footer_hint_normal);  
        }  
    }  
      
    public void setBottomMargin(int height) {  
        if (height < 0) return ;  
        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)mContentView.getLayoutParams();  
        lp.bottomMargin = height;  
        mContentView.setLayoutParams(lp);  
    }  
      
    public int getBottomMargin() {  
        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)mContentView.getLayoutParams();  
        return lp.bottomMargin;  
    }  
      
      
    /** 
     * normal status 
     */  
    public void normal() {  
        mHintView.setVisibility(View.VISIBLE);  
        mProgressBar.setVisibility(View.GONE);  
    }  
      
      
    /** 
     * loading status  
     */  
    public void loading() {  
        mHintView.setVisibility(View.GONE);  
        mProgressBar.setVisibility(View.VISIBLE);  
    }  
      
    /** 
     * hide footer when disable pull load more 
     */  
    public void hide() {  
        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)mContentView.getLayoutParams();  
        lp.height = 0;  
        mContentView.setLayoutParams(lp);  
    }  
      
    /** 
     * show footer 
     */  
    public void show() {  
        LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)mContentView.getLayoutParams();  
        lp.height = LayoutParams.WRAP_CONTENT;  
        mContentView.setLayoutParams(lp);  
    }  
      
    private void initView(Context context) {  
        mContext = context;  
        LinearLayout moreView = (LinearLayout)LayoutInflater.from(mContext).inflate(R.layout.xlistview_footer, null);  
        ViewUtil.scaleContentView((ViewGroup)moreView);  
        addView(moreView);  
        moreView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));  
          
        mContentView = moreView.findViewById(R.id.xlistview_footer_content);  
        mProgressBar =(GifView)moreView.findViewById(R.id.xlistview_footer_progressbar);  
        mProgressBar.setGifImage(R.drawable.loading);  
        mHintView = (TextView)moreView.findViewById(R.id.xlistview_footer_hint_textview);  
    }  
  
}  


总结:这是我的第一篇博客,萌生写博客的原因是因为平时很喜欢逛别人的博客,学习别人的东西。但是学习总是断断续续,而且平时学习的东西没有很好的记录。我想写博客来督促自己不断的学习,记录自己所学到的东西,并且分享出来。


源码地址:http://download.csdn.net/detail/lishengo0/9062111






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值