下面列出了android.widget.AbsListView#getChildAt ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (view.getCount() == 0) {
return;
}
switch (scrollState) {
case SCROLL_STATE_IDLE: {
mListScrollStarted = false;
break;
}
case SCROLL_STATE_TOUCH_SCROLL: {
final View firstChild = view.getChildAt(0);
mFirstVisibleItem = view.getFirstVisiblePosition();
mFirstVisibleTop = firstChild.getTop();
mFirstVisibleBottom = firstChild.getBottom();
mFirstVisibleHeight = firstChild.getHeight();
mListScrollStarted = true;
mTotalScrollDistance = 0;
break;
}
}
}
/**
* 主要算这玩意,PullToRefreshListView插入了一个刷新头部,因此要根据不同的情况计算当前的偏移量</br>
* <p/>
* 当刷新时: 刷新头部显示,因此偏移量要加上刷新头的数值 未刷新时: 偏移量不计算头部。
* <p/>
* firstVisiblePosition >1时,listview中的项开始显示,姑且认为每一项等高来计算偏移量(其实只要显示一个项,向上偏移
* 量已经大于头部的最大偏移量,因此不准确也没有关系)
*
* @param view
* @return
*/
public int getScrollY(AbsListView view) {
View c = view.getChildAt(0);
if (c == null) {
return 0;
}
int top = c.getTop();
int firstVisiblePosition = view.getFirstVisiblePosition();
if (firstVisiblePosition == 0) {
return -top + headerScrollSize;
} else if (firstVisiblePosition == 1) {
return -top;
} else {
return -top + (firstVisiblePosition - 2) * c.getHeight() + headerHeight;
}
}
private ContextualUndoView getContextualUndoView(final long dismissViewItemId) {
ContextualUndoView contextualUndoView = null;
AbsListView listView = getAbsListView();
int childCount = listView.getChildCount();
for (int i = 0; i < childCount; i++) {
View child = listView.getChildAt(i);
if (child instanceof ContextualUndoView) {
ContextualUndoView listItem = (ContextualUndoView) child;
if (listItem.getItemId() == dismissViewItemId) {
contextualUndoView = listItem;
}
}
}
return contextualUndoView;
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
final View topChild = view.getChildAt(0);
int firstViewTop = 0;
if (topChild != null) {
firstViewTop = topChild.getTop();
}
boolean goingDown;
boolean changed = true;
if (mPrevPosition == firstVisibleItem) {
final int topDelta = mPrevTop - firstViewTop;
goingDown = firstViewTop < mPrevTop;
changed = Math.abs(topDelta) > DIRECTION_CHANGE_THRESHOLD;
} else {
goingDown = firstVisibleItem > mPrevPosition;
}
if (changed && mUpdated) {
if (mFloatingView != null)
mFloatingView.hide(goingDown);
}
mPrevPosition = firstVisibleItem;
mPrevTop = firstViewTop;
mUpdated = true;
}
private void displayImage(AbsListView listView) {
int firstPos = listView.getFirstVisiblePosition();
int lastPos = listView.getLastVisiblePosition();
int totalCount = lastPos - firstPos + 1;
Log.v(TAG, "滚动停止加载图片..");
for (int i = 0; i < totalCount; i++) {
View view = listView.getChildAt(i);
Object tag = view.getTag();
if (!(tag instanceof StatusHolder)) {
continue;
}
StatusHolder holder = (StatusHolder)view.getTag();
ImageLoad4ThumbnailTask thumbnailTask = holder.thumbnailTask;
if (thumbnailTask != null
&& thumbnailTask.isCancelled() == false
&& thumbnailTask.getStatus() == Status.PENDING) {
thumbnailTask.execute();
}
QueryResponseCountTask responseCountTask = holder.responseCountTask;
if (responseCountTask != null
&& responseCountTask.isCancelled() == false
&& responseCountTask.getStatus() == Status.PENDING) {
responseCountTask.execute();
}
}
}
/**
* Updates the title and selected month if the view has moved to a new
* month.
*/
@Override
public void onScroll(
AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
MonthView child = (MonthView) view.getChildAt(0);
if (child == null) {
return;
}
// Figure out where we are
long currScroll = view.getFirstVisiblePosition() * child.getHeight() - child.getBottom();
mPreviousScrollPosition = currScroll;
mPreviousScrollState = mCurrentScrollState;
}
public static int getScrollY(AbsListView lv) {
View c = lv.getChildAt(0);
if (c == null) {
return 0;
}
int firstVisiblePosition = lv.getFirstVisiblePosition();
int scrollY = -(c.getTop());
// int scrollY = 0;
sListViewItemHeights.put(lv.getFirstVisiblePosition(), c.getHeight());
// if(scrollY>0)
// Log.d("QuickReturnUtils", "getScrollY() : -(c.getTop()) - "+ -(c.getTop()));
// else
// Log.i("QuickReturnUtils", "getScrollY() : -(c.getTop()) - "+ -(c.getTop()));
if (scrollY < 0)
scrollY = 0;
for (int i = 0; i < firstVisiblePosition; ++i) {
// Log.d("QuickReturnUtils", "getScrollY() : i - "+i);
// Log.d("QuickReturnUtils", "getScrollY() : sListViewItemHeights.get(i) - "+sListViewItemHeights.get(i));
if (sListViewItemHeights.get(i) != null) // (this is a sanity check)
scrollY += sListViewItemHeights.get(i); //add all heights of the views that are gone
}
// Log.d("QuickReturnUtils", "getScrollY() : scrollY - "+scrollY);
return scrollY;
}
/**
* Returns, whether a specific list view is scrolled to the top, or not.
*
* @param listView The list view as an instance of the class {@link AbsListView}. The list view may not
* be null
* @return True, if the given list view is scrolled to the top, false otherwise
*/
private boolean isListViewScrolledToTop(@NonNull final AbsListView listView) {
if (listView.getFirstVisiblePosition() == 0) {
if (listView.getChildCount() == 0) {
return true;
} else {
View child = listView.getChildAt(0);
return child == null || child.getTop() == 0;
}
}
return false;
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
View topChild = view.getChildAt(0);
if (topChild == null) {
onNewScroll(0);
} else if (topChild != mMarginView) {
onNewScroll(mHeaderContainer.getHeight());
} else {
onNewScroll(-topChild.getTop());
}
}
private static boolean scrolledToBottom(AbsListView listView) {
final int count = listView.getCount();
if (count == 0) {
return true;
} else if (listView.getLastVisiblePosition() == count - 1) {
final View lastChild = listView.getChildAt(listView.getChildCount() - 1);
return lastChild != null && lastChild.getBottom() <= listView.getHeight();
} else {
return false;
}
}
/**
* Updates the title and selected month if the view has moved to a new
* month.
*/
@Override
public void onScroll(
AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
MonthView child = (MonthView) view.getChildAt(0);
if (child == null) {
return;
}
// Figure out where we are
long currScroll = view.getFirstVisiblePosition() * child.getHeight() - child.getBottom();
mPreviousScrollPosition = currScroll;
mPreviousScrollState = mCurrentScrollState;
}
@Override
public void onScrollStateChanged(AbsListView absListView, int scrollState) {
Bundle args = getArguments();
fragmentIndex = args.getInt(ADAPTER_INDEX);
CustomListAdapter<?> adapter = getListAdapter(fragmentIndex);
adapter.setNotifiable(false);
if (absListView.getFirstVisiblePosition() == 0 && absListView.getChildAt(0) != null && absListView.getChildAt(0).getTop() == 0) {
if (scrollState == SCROLL_STATE_IDLE) {
updateListViewWithNotice(absListView, adapter, true);
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount) {
if (totalItemCount == 0 || !mListScrollStarted) {
return;
}
final View firstChild = view.getChildAt(0);
final int firstVisibleTop = firstChild.getTop(), firstVisibleBottom =
firstChild.getBottom();
final int firstVisibleHeight = firstChild.getHeight();
final int delta;
if (firstVisibleItem > mFirstVisibleItem) {
mFirstVisibleTop += mFirstVisibleHeight;
delta = firstVisibleTop - mFirstVisibleTop;
} else if (firstVisibleItem < mFirstVisibleItem) {
mFirstVisibleBottom -= mFirstVisibleHeight;
delta = firstVisibleBottom - mFirstVisibleBottom;
} else {
delta = firstVisibleBottom - mFirstVisibleBottom;
}
mTotalScrollDistance += delta;
if (mScrollDistanceListener != null) {
mScrollDistanceListener.onScrollDistanceChanged(delta, mTotalScrollDistance);
}
mFirstVisibleTop = firstVisibleTop;
mFirstVisibleBottom = firstVisibleBottom;
mFirstVisibleHeight = firstVisibleHeight;
mFirstVisibleItem = firstVisibleItem;
}
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
SimpleMonthView child = (SimpleMonthView) view.getChildAt(0);
if (child == null) {
return;
}
// Figure out where we are
long currScroll = view.getFirstVisiblePosition() * child.getHeight() - child.getBottom();
mPreviousScrollPosition = currScroll;
mPreviousScrollState = mCurrentScrollState;
}
@Override
public IAView getItemAt(int line) {
View view = getAndWaitForView();
AbsListView listView = (AbsListView)view;
if (listView.getCount()>line){
View child= listView.getChildAt(line);
AView childAView = new AView();
childAView.initialize(child, mScreen,MessageFormat.format("{0}.{1}{2}", mName,"Item",line));
return childAView;
}
return null;
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
MonthView child = (MonthView) view.getChildAt(0);
if (child == null)
return;
// Figure out where we are
mPreviousScrollPosition = getFirstVisiblePosition() * child.getHeight() - child.getBottom();
mPreviousScrollState = mCurrentScrollState;
}
@Override
public boolean isReadyForPull(View view, final float x, final float y) {
boolean ready = false;
// First we check whether we're scrolled to the top
AbsListView absListView = (AbsListView) view;
if (absListView.getCount() == 0) {
ready = true;
} else if (absListView.getFirstVisiblePosition() == 0) {
final View firstVisibleChild = absListView.getChildAt(0);
ready = firstVisibleChild != null && firstVisibleChild.getTop() >= absListView.getPaddingTop();
}
// Then we have to check whether the fas scroller is enabled, and check we're not starting
// the gesture from the scroller
if (ready && absListView.isFastScrollEnabled() && isFastScrollAlwaysVisible(absListView)) {
switch (getVerticalScrollbarPosition(absListView)) {
case View.SCROLLBAR_POSITION_RIGHT:
ready = x < absListView.getRight() - absListView.getVerticalScrollbarWidth();
break;
case View.SCROLLBAR_POSITION_LEFT:
ready = x > absListView.getVerticalScrollbarWidth();
break;
}
}
return ready;
}
/**
* Animate the item at given position away and show the undo {@link View}.
* @param position the position.
*/
public void swipeViewAtPosition(final int position) {
mCurrentRemovedId = getItemId(position);
for (int i = 0; i < getAbsListView().getChildCount(); i++) {
AbsListView absListView = getAbsListView();
View childView = absListView.getChildAt(i);
int positionForView = AdapterViewUtil.getPositionForView(absListView, childView);
if (positionForView == position) {
swipeView(childView, positionForView);
}
}
}
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
SimpleMonthView child = (SimpleMonthView) view.getChildAt(0);
if (child == null) {
return;
}
long currScroll = view.getFirstVisiblePosition() * child.getHeight() - child.getBottom();
mPreviousScrollPosition = currScroll;
mPreviousScrollState = mCurrentScrollState;
}
/**
* Updates the title and selected month if the view has moved to a new
* month.
*/
@Override
public void onScroll(
AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
MonthView child = (MonthView) view.getChildAt(0);
if (child == null) {
return;
}
// Figure out where we are
long currScroll = view.getFirstVisiblePosition() * child.getHeight() - child.getBottom();
mPreviousScrollPosition = currScroll;
mPreviousScrollState = mCurrentScrollState;
}