84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
如图,让和让最新那条插入的数据 显示在 顶部开始的地方,而旧的数据隐藏在顶部屏幕之外呢?
当插入 问题14的时候,,前13条被隐藏在顶部之外的地方了。怎么做到这样呢?模仿语言助手那种界面?如何做到
学习是最好的投资!
Both of the following two options are feasible through personal testing: Option 1: (no animation)
listView.setSelection(问题14的position);
Option 2: (with animation)
ListView lvBaseList is called after adding issue 14
final int targetPosition = 2;//假设你要置顶的ItemView的position = 2 final long targetId = adapter.getItemId(targetPosition); View child = getTargetView(lvBaseList, targetId); final boolean isVisible = child != null; if (isVisible) {//问题14已显示 Log.d(TAG, "lvBaseList.onItemClick isVisible = true >> "); Log.d(TAG, "lvBaseList.onItemClick lvBaseList.getY() = " + (int) lvBaseList.getY()); Log.d(TAG, "lvBaseList.onItemClick child.getY() = " + (int) child.getY()); lvBaseList.smoothScrollBy((int) (child.getY() - lvBaseList.getY()), 200); return; } //问题14未显示 Log.d(TAG, "lvBaseList.onItemClick isVisible = false >> "); lvBaseList.smoothScrollToPosition(targetPosition + lvBaseList.getHeaderViewsCount()); lvBaseList.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if (scrollState == SCROLL_STATE_IDLE) { lvBaseList.setOnScrollListener(null);//避免影响正常滚动 View child = getTargetView(lvBaseList, targetId); if (child == null) { Log.e(TAG, "lvBaseList.onItemClick child == null >> return;"); return; } Log.d(TAG, "lvBaseList.onItemClick lvBaseList.getY() = " + (int) lvBaseList.getY()); Log.d(TAG, "lvBaseList.onItemClick child.getY() = " + (int) child.getY()); // lvBaseList.scrollListBy((int) (child.getY() - lvBaseList.getY()));//可行,无动画 lvBaseList.smoothScrollBy((int) (child.getY() - lvBaseList.getY()), 200); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } });
Functions needed:
//根据targetId获取childView private View getTargetView(ListView lvBaseList, long targetId) { View child = null; MomentView itemView;//MomentView相当于ViewHolder,里面存放item数据或者itemId MomentItem item; for (int i = 0; i < lvBaseList.getChildCount(); i++) { child = lvBaseList.getChildAt(i); itemView = child == null ? null : (MomentView) child.getTag(); item = itemView == null ? null : itemView.getData(); Log.d(TAG, "lvBaseList.onItemClick item.getId() = " + (item == null ? 0 : item.getId()) + "; targetId = " + targetId); if (item != null && item.getId() == targetId) { Log.d(TAG, "lvBaseList.onItemClick item != null && item.getId() == targetId >> break;"); break; } child = null; } return child; }
Both of the following two options are feasible through personal testing:
Option 1: (no animation)
Option 2: (with animation)
ListView lvBaseList is called after adding issue 14
Functions needed: