1

私が達成しようとしているのは、次の方法で新しいビューが追加されたときに、スクロールビューの一番下まで自動的にスクロールすることです:

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オプションに交換しました

4

1 に答える 1