下面列出了android.widget.ListView#getFirstVisiblePosition ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
public static ListPosition obtain(ListView listView) {
int position = listView.getFirstVisiblePosition();
int y = 0;
Rect rect = new Rect();
int paddingTop = listView.getPaddingTop(), paddingLeft = listView.getPaddingLeft();
for (int i = 0, count = listView.getChildCount(); i < count; i++) {
View view = listView.getChildAt(i);
view.getHitRect(rect);
if (rect.contains(paddingLeft, paddingTop)) {
position += i;
y = rect.top - paddingTop;
break;
}
}
return new ListPosition(position, y);
}
public static RowViewInfo getCurrentRowViewInfo(FileListViewFragment host, Object item)
{
if(host == null || host.isRemoving() || !host.isResumed())
return null;
ListView list = host.getListView();
if(list == null)
return null;
int start = list.getFirstVisiblePosition();
for(int i=start, j=list.getLastVisiblePosition();i<=j;i++)
if(j<list.getCount() && item == list.getItemAtPosition(i))
{
RowViewInfo rvi = new RowViewInfo();
rvi.view = list.getChildAt(i-start);
rvi.position = i;
rvi.listView = list;
return rvi;
}
return null;
}
public void updatePilotNames() {
ListView mListView = (ListView)mRootView.findViewById(R.id.lvPilots);
int count = AppState.getInstance().deviceStates.size();
int firstVisibleItemPos = mListView.getFirstVisiblePosition();
int lastVisibleItemPos = mListView.getLastVisiblePosition();
// detect possible faulty edge cases
if (firstVisibleItemPos > lastVisibleItemPos ||
firstVisibleItemPos < 0 ||
lastVisibleItemPos > count - 1 ) return;
// update only visible list items
for (int i = firstVisibleItemPos; i <= lastVisibleItemPos; i++) {
// children enumeration starts with zero
View convertView = mListView.getChildAt(i - firstVisibleItemPos);
if (convertView != null) {
EditText pilotName = (EditText) convertView.findViewById(R.id.editPilotName);
String curPilotName = AppState.getInstance().deviceStates.get(i).pilotName;
pilotName.setText(curPilotName);
}
}
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (!Preferences.Lists.getScrollByButtons())
return false;
int action = event.getAction();
ListView scrollView = getListView();
int visibleItemsCount = scrollView.getLastVisiblePosition() - scrollView.getFirstVisiblePosition();
int keyCode = event.getKeyCode();
if(Preferences.System.isScrollUpButton(keyCode)){
if (action == KeyEvent.ACTION_DOWN)
scrollView.setSelection(Math.max(scrollView.getFirstVisiblePosition() - visibleItemsCount, 0));
return true;// true надо обязательно возвращать даже если не ACTION_DOWN иначе звук нажатия
}
if(Preferences.System.isScrollDownButton(keyCode)){
if (action == KeyEvent.ACTION_DOWN)
scrollView.setSelection(Math.min(scrollView.getLastVisiblePosition(), scrollView.getCount() - 1));
return true;// true надо обязательно возвращать даже если не ACTION_DOWN иначе звук нажатия
}
return false;
}
public void selectItem(int num) {
final ListView commitList = (ListView) getView().findViewById(R.id.git_history_commit_list);
selectedItem = num;
int selection = num - commitList.getFirstVisiblePosition();
//Keep the selected commit on screen... with a little bit of breathing room
if (num < commitList.getFirstVisiblePosition() + 2) {
commitList.setSelection(num == 0 ? num : num - 1);
} else if (num > commitList.getLastVisiblePosition() - 2) {
commitList.setSelection(num == commitList.getCount() - 1 ? num : num + 1);
}
for (int i = 0; i < commitList.getCount(); i ++) {
View child = commitList.getChildAt(i);
if (child != null) {
child.setBackgroundColor(selection == i
? getResources().getColor(R.color.holo_select)
: getResources().getColor(android.R.color.transparent));
}
}
}
public static Object getViewHolderByIndex(ListView listView, int index) {
int firstVisibleFeedPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount();
int lastVisibleFeedPosition = listView.getLastVisiblePosition() - listView.getHeaderViewsCount();
//只有获取可见区域的
if (index >= firstVisibleFeedPosition && index <= lastVisibleFeedPosition) {
View view = listView.getChildAt(index - firstVisibleFeedPosition);
Object tag = view.getTag();
return tag;
} else {
return null;
}
}
public View getViewByPosition(int pos, ListView listView) {
final int firstListItemPosition = listView.getFirstVisiblePosition();
final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;
if (pos < firstListItemPosition || pos > lastListItemPosition ) {
return null;
} else {
final int childIndex = pos - firstListItemPosition;
return listView.getChildAt(childIndex);
}
}
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
ListView listView = getListView();
int count = listView.getCheckedItemCount();
mode.setTitle(getResources().getQuantityString(R.plurals.itemsSelected, count, count));
// Update (redraw) list item view
int start = listView.getFirstVisiblePosition();
for (int i = start, j = listView.getLastVisiblePosition(); i <= j; i++) {
if (position == i) {
View view = listView.getChildAt(i - start);
listView.getAdapter().getView(i, view, listView);
break;
}
}
}
@Override
public boolean canTargetScrollVertically(int direction) {
final ListView target = mTarget;
final int itemCount = target.getCount();
if (itemCount == 0) {
return false;
}
final int childCount = target.getChildCount();
final int firstPosition = target.getFirstVisiblePosition();
final int lastPosition = firstPosition + childCount;
if (direction > 0) {
// Are we already showing the entire last item?
if (lastPosition >= itemCount) {
final View lastView = target.getChildAt(childCount - 1);
if (lastView.getBottom() <= target.getHeight()) {
return false;
}
}
} else if (direction < 0) {
// Are we already showing the entire first item?
if (firstPosition <= 0) {
final View firstView = target.getChildAt(0);
if (firstView.getTop() >= 0) {
return false;
}
}
} else {
// The behavior for direction 0 is undefined and we can return
// whatever we want.
return false;
}
return true;
}
public static ScrollState from (final ListView lv, final ScrollIndicator scrollIndicator, final ScrollDirection scrollDirection) {
final int index = lv.getFirstVisiblePosition();
final View v = lv.getChildAt(0);
final int top = (v == null) ? 0 : v.getTop();
final long itemId = lv.getAdapter().getItemId(index);
if (itemId <= 0) return null;
long time = ((TweetListCursorAdapter) lv.getAdapter()).getItemTime(index);
if (time < 0L) time = 0L;
return new ScrollState(itemId, top, time, scrollIndicator.getUnreadTime(), scrollDirection);
}
@Override
public boolean canChildScrollUp() {
// The real child maps cares about is the list, so check if that can scroll.
ListView target = (ListView) findViewById(android.R.id.list);
return target.getChildCount() > 0
&& (target.getFirstVisiblePosition() > 0
|| target.getChildAt(0).getTop() < target.getPaddingTop());
}
void onWordListClicked(final View v) {
// Note : v is the preference view
final ViewParent parent = v.getParent();
// Just in case something changed in the framework, test for the concrete class
if (!(parent instanceof ListView)) return;
final ListView listView = (ListView)parent;
final int indexToOpen;
// Close all first, we'll open back any item that needs to be open.
final boolean wasOpen = mInterfaceState.isOpen(mWordlistId);
mInterfaceState.closeAll();
if (wasOpen) {
// This button being shown. Take note that we don't want to open any button in the
// loop below.
indexToOpen = -1;
} else {
// This button was not being shown. Open it, and remember the index of this
// child as the one to open in the following loop.
mInterfaceState.setOpen(mWordlistId, mStatus);
indexToOpen = listView.indexOfChild(v);
}
final int lastDisplayedIndex =
listView.getLastVisiblePosition() - listView.getFirstVisiblePosition();
// The "lastDisplayedIndex" is actually displayed, hence the <=
for (int i = 0; i <= lastDisplayedIndex; ++i) {
final ButtonSwitcher buttonSwitcher = (ButtonSwitcher)listView.getChildAt(i)
.findViewById(R.id.wordlist_button_switcher);
if (i == indexToOpen) {
buttonSwitcher.setStatusAndUpdateVisuals(getButtonSwitcherStatus(mStatus));
} else {
buttonSwitcher.setStatusAndUpdateVisuals(ButtonSwitcher.STATUS_NO_BUTTON);
}
}
}
private static boolean canListViewScrollUp(ListView listView) {
if (android.os.Build.VERSION.SDK_INT >= 14) {
// For ICS and above we can call canScrollVertically() to determine this
return ViewCompat.canScrollVertically(listView, -1);
} else {
// Pre-ICS we need to manually check the first visible item and the child view's top
// value
return listView.getChildCount() > 0 &&
(listView.getFirstVisiblePosition() > 0
|| listView.getChildAt(0).getTop() < listView.getPaddingTop());
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
boolean loadMore = firstVisibleItem + visibleItemCount + VISIBLE_THRESHOLD >= totalItemCount;
if (loadMore && !loading && !refreshing) {
fragment.fillMore();
}
// enable/disable pull-to-refresh
SwipeRefreshLayout refreshLayout = fragment.getSwipeRefreshLayout();
if (firstVisibleItem == 0 && refreshLayout != null) {
refreshLayout.setEnabled(true);
} else {
refreshLayout.setEnabled(false);
}
// show/hide post "+" button
final ListView lw = fragment.getPostStreamView();
if (view.getId() == lw.getId()) {
final int currentFirstVisibleItem = lw.getFirstVisiblePosition();
if (currentFirstVisibleItem > mLastFirstVisibleItem) {
fragment.hideAddPostTopicBtn();
} else if (currentFirstVisibleItem < mLastFirstVisibleItem) {
fragment.showAddPostTopicBtn();
}
mLastFirstVisibleItem = currentFirstVisibleItem;
}
}
public boolean refresh() {
if (listNewBlogs == null || listNewBlogs.size() == 0) {
return false;
}
addCacheToFirst(listNewBlogs);
int offset = listNewBlogs.size();
listNewBlogs.clear();
ListView lvMicroBlog = (ListView)((Activity)context).findViewById(R.id.lvMicroBlog);
if (lvMicroBlog == null) {
return true;
}
Adapter adapter = lvMicroBlog.getAdapter();
if (adapter instanceof HeaderViewListAdapter) {
adapter = ((HeaderViewListAdapter)adapter).getWrappedAdapter();
}
if (adapter == this) {
int position = lvMicroBlog.getFirstVisiblePosition();
View view = lvMicroBlog.getChildAt(0);
int y = 0;
if (view != null && position >= 1) {
y = view.getTop();
//System.out.println("y:" + y + " position:" + position);
position += offset;
lvMicroBlog.setSelectionFromTop(position, y);
}
}
return true;
}
public void invalidateCommentView(ListView listView, int position) {
if (position != ListView.INVALID_POSITION) {
int first = listView.getFirstVisiblePosition();
int count = listView.getChildCount();
int index = position - first;
if (index >= 0 && index < count) {
View child = listView.getChildAt(index);
PostViewHolder holder = (PostViewHolder) child.getTag();
holder.comment.invalidate();
}
}
}
/**
* Get list item view by position
*
* @param pos position of list item.
* @param listView listview object.
* @return list item view associated with position in the listview.
*/
private View getViewByPosition(int pos, ListView listView) {
final int firstListItemPosition = listView.getFirstVisiblePosition();
final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;
if (pos < firstListItemPosition || pos > lastListItemPosition) {
return listView.getAdapter().getView(pos, null, listView);
} else {
final int childIndex = pos - firstListItemPosition;
return listView.getChildAt(childIndex);
}
}
private boolean hasHitTop() {
if (mMainView instanceof ScrollView) {
ScrollView scrollView = (ScrollView) mMainView;
return scrollView.getScrollY() == 0;
} else if (mMainView instanceof ListView) {
ListView listView = (ListView) mMainView;
if (listView.getAdapter() != null) {
if (listView.getAdapter().getCount() > 0) {
return listView.getFirstVisiblePosition() == 0 &&
listView.getChildAt(0).getTop() >= 0;
}
}
} else if (mMainView instanceof RecyclerView) {
RecyclerView recyclerView = (RecyclerView) mMainView;
if (recyclerView.getAdapter() != null && recyclerView.getLayoutManager() != null) {
RecyclerView.Adapter adapter = recyclerView.getAdapter();
if (adapter.getItemCount() > 0) {
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (layoutManager instanceof LinearLayoutManager) {
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
return linearLayoutManager.findFirstCompletelyVisibleItemPosition() == 0;
} else if (layoutManager instanceof StaggeredGridLayoutManager) {
StaggeredGridLayoutManager staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager;
int[] checks = staggeredGridLayoutManager.findFirstCompletelyVisibleItemPositions(null);
for (int check : checks) {
if (check == 0)
return true;
}
}
}
}
}
return false;
}
/**
* Utility method to check whether a {@link ListView} can scroll up from it's current position.
* Handles platform version differences, providing backwards compatible functionality where
* needed.
*/
private static boolean canListViewScrollUp(ListView listView) {
if (SdkUtils.hasIceCreamSandwich()) {
// For ICS and above we can call canScrollVertically() to determine this
return ViewCompat.canScrollVertically(listView, -1);
} else {
// Pre-ICS we need to manually check the first visible item and the child view's top
// value
return listView.getChildCount() > 0 &&
(listView.getFirstVisiblePosition() > 0
|| listView.getChildAt(0).getTop() < listView.getPaddingTop());
}
}
public static int getListYScroll(@NonNull final ListView list) {
View child = list.getChildAt(0);
return child == null ? -1
: list.getFirstVisiblePosition() * child.getHeight() - child.getTop() + list.getPaddingTop();
}