-
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();
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
最后
都说三年是程序员的一个坎,能否晋升或者提高自己的核心竞争力,这几年就十分关键。
技术发展的这么快,从哪些方面开始学习,才能达到高级工程师水平,最后进阶到Android架构师/技术专家?我总结了这 5大块;
我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。
《Android架构视频+BAT面试专题PDF+学习笔记》
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望**这份系统化的技术体系**对大家有一个方向参考。
哪些方面开始学习,才能达到高级工程师水平,最后进阶到Android架构师/技术专家?我总结了这 5大块;**
我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。
《Android架构视频+BAT面试专题PDF+学习笔记》
[外链图片转存中…(img-SXR10qZN-1710507158584)]
[外链图片转存中…(img-OQiMHU3B-1710507158584)]
[外链图片转存中…(img-yW2J7REV-1710507158585)]
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望**这份系统化的技术体系**对大家有一个方向参考。
2021年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。祝大家2021年万事大吉。