84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
如图,让和让最新那条插入的数据 显示在 顶部开始的地方,而旧的数据隐藏在顶部屏幕之外呢?
当插入 问题14的时候,,前13条被隐藏在顶部之外的地方了。怎么做到这样呢?模仿语言助手那种界面?如何做到
学习是最好的投资!
以下兩種方案都親測可行:方案一:(無動畫)
listView.setSelection(问题14的position);
方案二:(含動畫)
ListView lvBaseList新增問題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) { } });
需要用到的函數:
//根据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; }
以下兩種方案都親測可行:
方案一:(無動畫)
方案二:(含動畫)
ListView lvBaseList新增問題14後呼叫
需要用到的函數: