-
mRefreshViewImage.setMinimumHeight(50);
-
mRefreshView.setOnClickListener(new OnClickRefreshListener());
-
mRefreshOriginalTopPadding = mRefreshView.getPaddingTop();
-
mRefreshOriginalBottomPadding = mRefreshView.getPaddingBottom();
-
mRefreshState = TAP_TO_REFRESH;
-
// addHeaderView(mRefreshView);
-
addFooterView(mRefreshView);
-
super.setOnScrollListener(this);
-
measureView(mRefreshView);
-
mRefreshViewHeight = mRefreshView.getMeasuredHeight();
-
}
-
@Override
-
protected void onAttachedToWindow() {
-
//setSelection(1);
-
}
-
@Override
-
public void setAdapter(ListAdapter adapter) {
-
super.setAdapter(adapter);
-
//setSelection(1);
-
}
-
/**
-
* Set the listener that will receive notifications every time the list
-
* scrolls.
-
*
-
* @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();
-
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
最后
都说三年是程序员的一个坎,能否晋升或者提高自己的核心竞争力,这几年就十分关键。
技术发展的这么快,从哪些方面开始学习,才能达到高级工程师水平,最后进阶到Android架构师/技术专家?我总结了这 5大块;
我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 PDF(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。
Java语言与原理;
大厂,小厂。Android面试先看你熟不熟悉Java语言
高级UI与自定义view;
自定义view,Android开发的基本功。
性能调优;
数据结构算法,设计模式。都是这里面的关键基础和重点需要熟练的。
NDK开发;
未来的方向,高薪必会。
前沿技术;
组件化,热升级,热修复,框架设计
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
我在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多
当然,想要深入学习并掌握这些能力,并不简单。关于如何学习,做程序员这一行什么工作强度大家都懂,但是不管工作多忙,每周也要雷打不动的抽出 2 小时用来学习。
不出半年,你就能看出变化!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
mg-K7W1MfFU-1713785409614)]
高级UI与自定义view;
自定义view,Android开发的基本功。
[外链图片转存中…(img-Gy7Ebn4v-1713785409615)]
性能调优;
数据结构算法,设计模式。都是这里面的关键基础和重点需要熟练的。
[外链图片转存中…(img-nEUbvufj-1713785409616)]
NDK开发;
未来的方向,高薪必会。
[外链图片转存中…(img-xVSfXffi-1713785409617)]
前沿技术;
组件化,热升级,热修复,框架设计
[外链图片转存中…(img-EJs8vhOS-1713785409618)]
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
我在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多
当然,想要深入学习并掌握这些能力,并不简单。关于如何学习,做程序员这一行什么工作强度大家都懂,但是不管工作多忙,每周也要雷打不动的抽出 2 小时用来学习。
不出半年,你就能看出变化!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!