我想要实现的是在通过以下方式添加新视图时自动滚动到滚动视图的底部:
mContainerView.addView(newView);
这是我目前的代码:
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String input = et.getText().toString();
if (input != null && input.length() > 0) {
findViewById(android.R.id.empty).setVisibility(View.GONE);
addItem(input);
et.setText(null);
ScrollToBottom();
}
}
});
private void ScrollToBottom() {
mScrollView.postDelayed(new Runnable() {
@Override
public void run() {
mScrollView.smoothScrollTo(0, mScrollView.getBottom());
}
}, 300);
}
private void addItem(String name) {
final ViewGroup newView = (ViewGroup) LayoutInflater.from(this).inflate(
R.layout.list_item_example, mContainerView, false);
((TextView) newView.findViewById(android.R.id.text1)).setText(name);
newView.findViewById(R.id.delete_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mContainerView.removeView(newView);
if (mContainerView.getChildCount() == 0) {
findViewById(android.R.id.empty).setVisibility(View.VISIBLE);
}
}
});
mContainerView.addView(newView);
}
我使用 postDelayed 的原因是因为没有延迟,新视图的绘制速度不够快,我最终滚动到底部减去新条目的高度。我知道是这种情况,因为如果我将延迟时间降低到例如 100 毫秒,则滚动最终将完成新条目的大约三分之一。经过不同值的反复试验,300ms 是让我得到想要的结果的数字。
有没有更好的方法来实现这一目标?- 目前我的方法有效,但它似乎不是最干净的选择。
我对 Android/Java 编程还比较陌生,所以我确定我可能在某个地方遗漏了一些东西......
我应该提到我也尝试过 fullScroll(View.FOCUS_DOWN) ,但行为没有任何变化。我把它换成了 smoothScroll 选项,因为我更喜欢更平滑的动画