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 毫秒,则滚动最终将完成新条目的大约三分之一。经过不同值的反复试验,300ms 是让我得到想要的结果的数字。

有没有更好的方法来实现这一目标?- 目前我的方法有效,但它似乎不是最干净的选择。

我对 Android/Java 编程还比较陌生,所以我确定我可能在某个地方遗漏了一些东西......

我应该提到我也尝试过 fullScroll(View.FOCUS_DOWN) ,但行为没有任何变化。我把它换成了 smoothScroll 选项,因为我更喜欢更平滑的动画

4

1 回答 1

1

listview 和 listadapter 会是更好的选择吗?

那是我的建议。特别是,ListView它有一个所谓的“转录模式”,当您将新条目添加到ArrayAdapter. 除了处理“转录模式”之外,最大的好处ScrollView是视图回收,因此大量更新不会占用您应用程序中的大量堆空间。

在 aListFragment中,您将执行以下操作以启用转录模式:

getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);

可能(尽管不一定)从您设置ListAdapter.

如果您的适配器是ArrayAdapter<SomethingFun>,您只需调用add()ArrayAdapter附加新模型,它们将自动显示在ListView. 在“正常”转录模式下,用户将看到新条目,除非他们向上滚动查看一些历史记录,在这种情况下,滚动位置被单独保留。IOW,您通常在聊天式应用程序中看到的内容。

于 2013-06-09T22:54:40.540 回答