以编程方式将项目添加到scrollview顶部,但不应滚动到顶部

时间:2014-04-14 06:32:59

标签: android scrollview android-linearlayout

我有子视线LinearLayout的scrollview。我正在为它添加programmaticaly数据。当我将一些数据添加到linearlayout的顶部时,它会自动滚动到顶部元素。但我想要的东西,用户达到顶部 - >向上滚动以加载以前的数据 - >将数据添加到linearlayout top但不应该获得焦点,添加完成后,如果用户滚动然后只显示它。

如何实现这一目标?

3 个答案:

答案 0 :(得分:1)

嗯,我想到了一种方式,它的工作方式几乎完美。

我在ScrollView(svCommunications)中有一个LinearLayout(llCommunicationsLayout)。

我给一个新的LinearLayout充气,我要在这个新的LinearLayout顶部添加视图,然后将这个新的布局添加到ScrollView内的LinearLayout。

这是新的布局:

final LinearLayout wrapperLayout = (LinearLayout) mInflater.inflate(R.layout.empty_layout, null);

我将我的观点添加到此布局的第0位。

wrapperLayout.addView(view, 0);

将所有视图添加到wrapperLayout后,我将wrapperLayout添加到llCommunicationsLayout(我的ScrollView中的那个)

llCommunicationsLayout.addView(wrapperLayout, 0);

在此之后,我在wrapperLayout在屏幕上(具有可测量的高度)后计算它们的高度

wrapperLayout.post(new Runnable() {

                    @Override
                    public void run() {
                        int wrapperHeight = wrapperLayout.getHeight();

                        int svHeight = svCommunications.getHeight();

                        int scrollHeight = Math.abs(svHeight - wrapperHeight);

                        DisplayMetrics displaymetrics = new DisplayMetrics();
                        getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
                        int displayHeight = displaymetrics.heightPixels / 4;


                        svCommunications.scrollTo(0, (scrollHeight + displayHeight));

                    }
                });

在这里,我获得了新添加的布局和ScrollView的高度。

我计算它们的差异,加上我设备屏幕高度的1/4并滚动它,瞧!

它并不完美,但在添加布局后,它不再滚动到屏幕顶部。尝试使用displayHeight获取不同的结果。

希望这可以帮助别人。

答案 1 :(得分:0)

您可以抓取位于LinearLayout顶部的当前视图,然后将新内容添加到LinearLayout,然后滚动回查看之前位于顶部的视图。代码类似于:

public void addViewsOnTop(List<View> views) {
    final View currentViewOnTop = (linearLayout.getChildCount() > 0) ? linearLayout.getChildAt(0) : null;

    // Add Views. Note that views will appear in reverse order
    for(View view : views) {
        linearLayout.addView(view, 0);
    }

    // Scroll back to view which was on top
    if(currentViewOnTop != null) {
        new Handler().post(new Runnable() {
            @Override
            public void run() {
                scrollView.scrollTo(0, currentViewOnTop.getBottom());
            }
        });
    }
}

答案 2 :(得分:-1)

解决.... 试试这个,为我工作,

lv_chat.setAdapter(适配器); lv_chat.setSelection(somePreviousPosition);