Maison > Questions et réponses > le corps du texte
如图,让和让最新那条插入的数据 显示在 顶部开始的地方,而旧的数据隐藏在顶部屏幕之外呢?
当插入 问题14的时候,,前13条被隐藏在顶部之外的地方了。怎么做到这样呢?
模仿语言助手那种界面?如何做到
黄舟2017-04-18 09:17:37
Les deux options suivantes sont réalisables grâce à des tests personnels :
Option 1 : (Pas d'animation)
listView.setSelection(问题14的position);
Option 2 : (avec animation)
ListView lvBaseList est appelé après l'ajout du numéro 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) {
}
});
Fonctions nécessaires :
//根据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;
}