私が達成しようとしているのは、次の方法で新しいビューが追加されたときに、スクロールビューの一番下まで自動的にスクロールすることです:
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 ミリ秒に下げると、スクロールは新しいエントリの約 3 分の 1 で終了するため、これが当てはまることはわかっています。さまざまな値で試行錯誤した後、300ms が望ましい結果を得た数値でした。
これを達成するためのより良い方法はありますか?- 現在、私の方法は機能していますが、最もクリーンなオプションではないようです。
私はまだ Android/Java プログラミングに比較的慣れていないので、どこかで何かを見逃している可能性があると確信しています...
動作を変更することなく、 fullScroll(View.FOCUS_DOWN) も試したことに言及する必要があります。よりスムーズなアニメーションを好んだので、smoothScrollオプションに交換しました