替代ScrollView中的postDelayed方法

时间:2013-06-09 22:43:37

标签: android scrollview postdelayed

我想要实现的是当通过以下方式添加新视图时自动滚动到滚动视图的底部:

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的原因是因为没有延迟,新视图绘制得不够快,我最终滚动到底部减去新条目的高度。我知道情况就是如此,因为如果我将延迟时间减少到例如100ms,则滚动结束时将完成新条目的三分之一。经过试验和错误,不同的值300毫秒是得到我想要的结果的数字。

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

我还是相对较新的Android / Java编程所以我确定我可能错过了某些地方...

我应该提一下,我也尝试过fullScroll(View.FOCUS_DOWN),行为没有任何改变。我把它换成了smoothScroll选项,因为我更喜欢更流畅的动画

1 个答案:

答案 0 :(得分:1)

  

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

这是我的建议。特别是,ListView具有所谓的"成绩单模式"当您向ArrayAdapter添加新条目时,可以使用它自动滚动到底部。比ScrollView更大的好处 - 除了处理"成绩单模式" - 是视图回收,因此很多更新不会占用应用程序中的大量堆空间。

ListFragment中,你可以执行类似的操作来启用记录模式:

getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);

可能(但不一定)来自您设置ListAdapter的任何地方。

如果你的适配器是ArrayAdapter<SomethingFun>,你只需拨打add()上的ArrayAdapter即可添加新模型,它们会自动显示在{{1}的底部}。在&#34;正常&#34;成绩单模式,用户将看到新的条目,除非他们向上滚动以查看某些历史记录,在这种情况下滚动位置保持不变。 IOW,你通常在聊天风格的应用程序中看到的内容。