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后调用
需要用到的函数: