-
*
-
* @param l The scroll listener.
-
*/
-
@Override
-
public void setOnScrollListener(AbsListView.OnScrollListener l) {
-
mOnScrollListener = l;
-
}
-
/**
-
* Register a callback to be invoked when this list should be refreshed.
-
*
-
* @param onRefreshListener The callback to run.
-
*/
-
public void setOnRefreshListener(OnRefreshListener onRefreshListener) {
-
mOnRefreshListener = onRefreshListener;
-
}
-
/**
-
* Set a text to represent when the list was last updated.
-
* @param lastUpdated Last updated at.
-
*/
-
public void setLastUpdated(CharSequence lastUpdated) {
-
if (lastUpdated != null) {
-
mRefreshViewLastUpdated.setVisibility(View.VISIBLE);
-
mRefreshViewLastUpdated.setText(lastUpdated);
-
} else {
-
mRefreshViewLastUpdated.setVisibility(View.GONE);
-
}
-
}
-
@Override
-
public boolean onTouchEvent(MotionEvent event) {
-
final int y = (int) event.getY();
-
Log.i(“PullToRefreshListView”, “Height:” + getMeasuredHeight());
-
Log.i(“PullToRefreshListView”, “MotionEvent:” + event.getAction());
-
Log.i(“PullToRefreshListView”, “mRefreshState:” + mRefreshState);
-
Log.i(“PullToRefreshListView”, “FirstVisiblePosition:” + getFirstVisiblePosition());
-
Log.i(“PullToRefreshListView”, “LastVisiblePosition:” + getLastVisiblePosition());
-
Log.i(“PullToRefreshListView”, “ChildCount:” + getAdapter().getCount());
-
Log.i(“PullToRefreshListView”, “RefreshViewBottom:” + mRefreshView.getBottom());
-
Log.i(“PullToRefreshListView”, “RefreshViewTop:” + mRefreshView.getTop());
-
Log.i(“PullToRefreshListView”, “mRefreshViewHeight:” + mRefreshViewHeight);
-
Log.i(“PullToRefreshListView”, " ");
-
Log.i(“PullToRefreshListView”, " ");
-
Log.i(“PullToRefreshListView”, " ");
-
switch (event.getAction()) {
-
case MotionEvent.ACTION_UP:
-
if (!isVerticalScrollBarEnabled()) {
-
setVerticalScrollBarEnabled(true);
-
}
-
if (getLastVisiblePosition() == getAdapter().getCount() - 1
-
&& mRefreshState != REFRESHING) {
-
if ((
-
mRefreshView.getTop() <= getMeasuredHeight() - mRefreshViewHeight)
-
&& mRefreshState == RELEASE_TO_REFRESH) {
-
// Log.i(“PullToRefreshListView”, “Fire…”);
-
// Log.i(“PullToRefreshListView”, " ");
-
// Log.i(“PullToRefreshListView”, " ");
-
// Log.i(“PullToRefreshListView”, " ");
-
// Initiate the refresh
-
mRefreshState = REFRESHING;
-
prepareForRefresh();
-
onRefresh();
-
} else if (
-
mRefreshView.getTop() > getMeasuredHeight() - mRefreshViewHeight) {
-
// Abort refresh and scroll down below the refresh view
-
resetHeader();
-
//setSelection(1);
-
// Log.v(“PPMacbook”, “pi:” + (getSelectedItemPosition() - 1));
-
// setSelectionAfterHeaderView();
-
// setSelection(getSelectedItemPosition() - 1);
-
// System.out.println(“PPMacbook:” + (getFirstVisiblePosition() - 1));
-
setSelection((getFirstVisiblePosition() - 1));
-
}
-
}
-
break;
-
case MotionEvent.ACTION_DOWN:
-
mLastMotionY = y;
-
break;
-
case MotionEvent.ACTION_MOVE:
-
applyHeaderPadding(event);
-
break;
-
}
-
return super.onTouchEvent(event);
-
}
-
private void applyHeaderPadding(MotionEvent ev) {
-
final int historySize = ev.getHistorySize();
-
// Workaround for getPointerCount() which is unavailable in 1.5
-
// (it’s always 1 in 1.5)
-
int pointerCount = 1;
-
try {
-
Method method = MotionEvent.class.getMethod(“getPointerCount”);
-
pointerCount = (Integer)method.invoke(ev);
-
} catch (NoSuchMethodException e) {
-
pointerCount = 1;
-
} catch (IllegalArgumentException e) {
-
throw e;
-
} catch (IllegalAccessException e) {
-
System.err.println("unexpected " + e);
-
} catch (InvocationTargetException e) {
-
System.err.println("unexpected " + e);
-
}
-
// Log.i(“PullToRefreshListView”, “historySize:” + historySize);
-
// Log.i(“PullToRefreshListView”, “pointerCount:” + pointerCount);
-
// Log.i(“PullToRefreshListView”, " ");
-
// Log.i(“PullToRefreshListView”, " ");
-
// Log.i(“PullToRefreshListView”, " ");
-
for (int h = 0; h < historySize; h++) {
-
for (int p = 0; p < pointerCount; p++) {
-
if (mRefreshState == RELEASE_TO_REFRESH) {
-
if (isVerticalFadingEdgeEnabled()) {
-
setVerticalScrollBarEnabled(false);
-
}
-
int historicalY = 0;
-
try {
-
// For Android > 2.0
-
Method method = MotionEvent.class.getMethod(
-
“getHistoricalY”, Integer.TYPE, Integer.TYPE);
-
historicalY = ((Float) method.invoke(ev, p, h)).intValue();
-
} catch (NoSuchMethodException e) {
-
// For Android < 2.0
-
historicalY = (int) (ev.getHistoricalY(h));
-
} catch (IllegalArgumentException e) {
-
throw e;
-
} catch (IllegalAccessException e) {
-
System.err.println("unexpected " + e);
-
} catch (InvocationTargetException e) {
-
System.err.println("unexpected " + e);
-
}
-
// Calculate the padding to apply, we divide by 1.7 to
-
// simulate a more resistant effect during pull.
-
int topPadding = (int) (((historicalY + mLastMotionY)
-
+ mRefreshViewHeight) / 1.7);
-
mRefreshView.setPadding(
-
mRefreshView.getPaddingLeft(),
-
mRefreshView.getPaddingTop(),
-
mRefreshView.getPaddingRight(),
-
topPadding);
-
}
-
}
-
}
-
}
-
/**
-
* Sets the header padding back to original size.
-
*/
-
private void resetHeaderPadding() {
-
mRefreshView.setPadding(
-
mRefreshView.getPaddingLeft(),
-
mRefreshView.getPaddingTop(),
-
mRefreshView.getPaddingRight(),
-
mRefreshOriginalBottomPadding);
-
}
-
/**
-
* Resets the header to the original state.
-
*/
-
private void resetHeader() {
-
if (mRefreshState != TAP_TO_REFRESH) {
-
mRefreshState = TAP_TO_REFRESH;
-
resetHeaderPadding();
-
// Set refresh view text to the pull label
-
mRefreshViewText.setText(R.string.pull_to_refresh_tap_label);
-
// Replace refresh drawable with arrow drawable
-
mRefreshViewImage.setImageResource(R.drawable.ic_pulltorefresh_arrow);
-
// Clear the full rotation animation
-
mRefreshViewImage.clearAnimation();
-
// Hide progress bar and arrow.
-
mRefreshViewImage.setVisibility(View.GONE);
-
mRefreshViewProgress.setVisibility(View.GONE);
-
}
-
}
-
private void measureView(View child) {
-
ViewGroup.LayoutParams p = child.getLayoutParams();
-
if (p == null) {
-
p = new ViewGroup.LayoutParams(
-
ViewGroup.LayoutParams.FILL_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 void onScroll(AbsListView view, int firstVisibleItem,
-
int visibleItemCount, int totalItemCount) {
-
// Log.i(“PullToRefreshListView”, “firstVisibleItem:” + firstVisibleItem);
-
// Log.i(“PullToRefreshListView”, “visibleItemCount:” + visibleItemCount);
-
// Log.i(“PullToRefreshListView”, “totalItemCount:” + totalItemCount);
-
// Log.i(“PullToRefreshListView”, “”);
-
// Log.i(“PullToRefreshListView”, “”);
-
// Log.i(“PullToRefreshListView”, “”);
-
// When the refresh view is completely visible, change the text to say
-
// “Release to refresh…” and flip the arrow drawable.
-
if (mCurrentScrollState == SCROLL_STATE_TOUCH_SCROLL
-
&& mRefreshState != REFRESHING) {
-
if (firstVisibleItem + visibleItemCount == totalItemCount) {
-
mRefreshViewImage.setVisibility(View.VISIBLE);
-
if ((
-
mRefreshView.getTop() <= getMeasuredHeight() - mRefreshViewHeight)
-
&& mRefreshState != RELEASE_TO_REFRESH) {
-
mRefreshViewText.setText(R.string.pull_to_refresh_release_label);
-
mRefreshViewImage.clearAnimation();
-
mRefreshViewImage.startAnimation(mFlipAnimation);
-
mRefreshState = RELEASE_TO_REFRESH;
-
} else if (
-
mRefreshView.getTop() >getMeasuredHeight() - 20 - mRefreshViewHeight
-
&& mRefreshState != PULL_TO_REFRESH) {
-
mRefreshViewText.setText(R.string.pull_to_refresh_pull_label);
-
if (mRefreshState != TAP_TO_REFRESH) {
-
mRefreshViewImage.clearAnimation();
-
mRefreshViewImage.startAnimation(mReverseFlipAnimation);
-
}
-
mRefreshState = PULL_TO_REFRESH;
-
}
-
} else {
-
mRefreshViewImage.setVisibility(View.GONE);
-
resetHeader();
-
}
-
} else if (mCurrentScrollState == SCROLL_STATE_FLING
-
&& firstVisibleItem + visibleItemCount == totalItemCount
-
&& mRefreshState != REFRESHING) {
-
//setSelection(1);
-
// Log.i(“PullToRefreshListView”, “Selection:” + (totalItemCount - visibleItemCount));
-
setSelection(getSelectedItemPosition() - 2);
-
//
-
setSelection((getFirstVisiblePosition() - 1));
-
}
-
if (mOnScrollListener != null) {
-
mOnScrollListener.onScroll(view, firstVisibleItem,
-
visibleItemCount, totalItemCount);
-
}
-
}
-
@Override
-
public void onScrollStateChanged(AbsListView view, int scrollState) {
-
mCurrentScrollState = scrollState;
-
if (mOnScrollListener != null) {
-
mOnScrollListener.onScrollStateChanged(view, scrollState);
-
}
-
}
-
public void prepareForRefresh() {
-
resetHeaderPadding();
-
mRefreshViewImage.setVisibility(View.GONE);
-
// We need this hack, otherwise it will keep the previous drawable.
-
mRefreshViewImage.setImageDrawable(null);
-
mRefreshViewProgress.setVisibility(View.VISIBLE);
-
// Set refresh view text to the refreshing label
-
mRefreshViewText.setText(R.string.pull_to_refresh_refreshing_label);
-
mRefreshState = REFRESHING;
-
}
-
public void onRefresh() {
-
Log.d(TAG, “onRefresh”);
-
if (mOnRefreshListener != null) {
-
mOnRefreshListener.onRefresh();
-
}
-
}
-
/**
-
* Resets the list to a normal state after a refresh.
-
* @param lastUpdated Last updated at.
-
*/
-
public void onRefreshComplete(CharSequence lastUpdated) {
-
setLastUpdated(lastUpdated);
-
onRefreshComplete();
-
}
-
/**
-
* Resets the list to a normal state after a refresh.
-
*/
-
public void onRefreshComplete() {
-
Log.d(TAG, “onRefreshComplete”);
-
resetHeader();
-
// If refresh view is visible when loading completes, scroll down to
-
// the next item.
-
if (mRefreshView.getBottom() > 0) {
-
invalidateViews();
-
//setSelection(1);
-
}
-
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://img-blog.csdnimg.cn/img_convert/86fa0fa4a00b47838a371b0e6b69e5bb.jpeg)
文末
很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我整理了一些资料,需要的可以免费分享给大家
这里笔者分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
【视频教程】
天道酬勤,只要你想,大厂offer并不是遥不可及!希望本篇文章能为你带来帮助,如果有问题,请在评论区留言。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
,并且会持续更新!**
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://img-blog.csdnimg.cn/img_convert/86fa0fa4a00b47838a371b0e6b69e5bb.jpeg)
文末
很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,对此我整理了一些资料,需要的可以免费分享给大家
这里笔者分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。
[外链图片转存中…(img-nBTonf92-1712375905495)]
[外链图片转存中…(img-4yqHPlMV-1712375905495)]
【视频教程】
[外链图片转存中…(img-Zz9lSrP3-1712375905495)]
天道酬勤,只要你想,大厂offer并不是遥不可及!希望本篇文章能为你带来帮助,如果有问题,请在评论区留言。
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!