如何滚动到长ScrollView布局的顶部?

时间:2010-11-07 20:04:32

标签: android listview scrollview

对于我的部分应用,系统会向用户显示一个名称列表,并要求他们按照自己的意愿对其进行分组。

(注意,ListView代码是从Android Views教程中逐字复制的。我还没有根据我的需要对其进行定制,我只想弄清楚如何使其工作。)

基本布局是一个LinearLayout,包含一个ScrollView(在下面的代码中称为“groupsScrollView”),包含一个RelativeLayout。我有一些按钮和文本,然后是我的ListView,它显示了名称列表。所有这一切都高于可见屏幕区域,因此允许用户垂直滚动以查看所有内容。

这一切都很漂亮,除非页面加载时总是预先滚动到我的ListView顶部 - 在页面中间。我创建的用于告诉用户要做什么的文本和按钮是不可见的。

我可以抓住屏幕并向上滚动,这很好用,但我希望屏幕加载已经滚动到顶部。用户不必向上滚动以查看新加载页面的顶部。但是我尝试以编程方式滚动到屏幕顶部的所有内容都失败了。

这是我的onCreate方法:

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.groups);

    mainScrollView = (ScrollView)findViewById(R.id.groupsScrollView);

    //get the Bundle out of the Intent...
    Bundle extras = getIntent().getExtras();
    mNames = extras.getStringArray("mNames");

    setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, mNames));

    ListView lv = getListView();
    lv.setTextFilterEnabled(true);

    //This is the line I'm having issues with
    mainScrollView.pageScroll(View.FOCUS_UP);

    lv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
            int position, long id) {
          // When clicked, show a toast with the TextView text
          Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
              Toast.LENGTH_SHORT).show();
        }
      });
}

行“mainScrollView.pageScroll(View.FOCUS_UP);是问题。它不会导致错误,但似乎没有做任何事情。我尝试过scrollTo(0,0),scrollDirection( View.FOCUS_UP),以及我能想到的其他一切。

由于我没有收到错误,我必须假设这些滚动命令实际上正在工作,但它们滚动到ListView的顶部,而不是包含它的ScrollView或RelativeLayout的顶部。这似乎是由谷歌自己对scrollTo(int x,int y)方法的描述所证实的,他们说“这个版本也会将滚动限制在我们孩子的范围内”。

因此,为了解决更长的问题,如何在ScrollView中包含的屏幕上加载一堆视图,然后以编程方式将整个视图滚动到页面顶部,以便用户可以与它进行交互? / p>

谢谢!

15 个答案:

答案 0 :(得分:241)

尝试

mainScrollView.fullScroll(ScrollView.FOCUS_UP);

它应该有用。

答案 1 :(得分:165)

有同样的问题,可能是某种bug。

即使来自其他答案的fullScroll(ScrollView.FOCUS_UP)也无效。
只有对我有用的事情是在显示对话框后立即调用scroll_view.smoothScrollTo(0,0)

答案 2 :(得分:94)

我有同样的问题,这解决了它。希望它可以帮到你。

listView.setFocusable(false);

答案 3 :(得分:49)

scrollViewObject.fullScroll(ScrollView.FOCUS_UP)这很好用,但只有这一行的问题是,当在scrollViewObject中填充数据时,会立即调用。您必须等待几毫秒才能填充数据。试试这段代码:

scrollViewObject.postDelayed(new Runnable() {
    @Override
    public void run() {
        scroll.fullScroll(ScrollView.FOCUS_UP);
    }
}, 600);

OR

 scrollViewObject.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        scrollViewObject.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        scrollViewObject.fullScroll(View.FOCUS_UP);
    }
});

答案 4 :(得分:32)

所有这些有效解决方案的主要问题是,当您未在屏幕上绘制时,您正试图向上移动滚动。

您需要等到滚动视图显示在屏幕上,然后使用任何这些解决方案将其移动到上方。这比postdelay更好,因为你不介意延迟。

    // Wait until my scrollView is ready
    scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            // Ready, move up
            scrollView.fullScroll(View.FOCUS_UP);
        }
    });

答案 5 :(得分:27)

非常简单

    ScrollView scroll = (ScrollView) findViewById(R.id.addresses_scroll);
    scroll.setFocusableInTouchMode(true);
    scroll.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);

答案 6 :(得分:23)

我面临同样的问题当我在View Flipper或Dialog中使用Scrollview时,scrollViewObject.fullScroll(ScrollView.FOCUS_UP)案例返回false,以便案例scrollViewObject.smoothScrollTo(0, 0)为我工作

Scroll Focus Top

答案 7 :(得分:19)

 final ScrollView scrollview = (ScrollView)findViewById(R.id.selected_place_layout_scrollview);

         scrollview.post(new Runnable() { 
                public void run() { 
                    scrollview.scrollTo(0, 0); 
                } 
            }); 

答案 8 :(得分:9)

runOnUiThread( new Runnable(){
   @Override
   public void run(){
      mainScrollView.fullScroll(ScrollView.FOCUS_UP);
   }
}

答案 9 :(得分:5)

这是强力滚动 scrollview

            scrollView.post(new Runnable() {
                @Override
                public void run() {
                    scrollView.scrollTo(0, 0);
                    scrollView.pageScroll(View.FOCUS_UP);
                    scrollView.smoothScrollTo(0,0);
                }
            });

答案 10 :(得分:5)

这对我有用

scroll_view.smoothScrollTo(0,0); // scroll to top of screen

答案 11 :(得分:4)

我这样在Kotlin修复了问题:

scrollview.isFocusableInTouchMode = true
scrollview.fullScroll(View.FOCUS_UP)
scrollview.smoothScrollTo(0,0)

答案 12 :(得分:2)

scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        // Ready, move up
        scrollView.fullScroll(View.FOCUS_UP);
    }
});

答案 13 :(得分:0)

@SuppressWarnings({ "deprecation", "unchecked" })
public void swipeTopToBottom(AppiumDriver<MobileElement> driver) 
                    throws InterruptedException {
       Dimension dimensions = driver.manage().window().getSize();
        Double screenHeightStart = dimensions.getHeight() * 0.30;
        int scrollStart = screenHeightStart.intValue();
        System.out.println("s="+scrollStart);
        Double screenHeightEnd = dimensions.getHeight()*0.90;
        int scrollEnd = screenHeightEnd.intValue();
        driver.swipe(0,scrollStart,0,scrollEnd,2000);
        CommonUtils.threadWait(driver, 3000);
    }

答案 14 :(得分:0)

此解决方案也适用于NestedScrollView

NestedScrollView nestedScrollView = view.findViewById(R.id.YourNestedScrollViewID);
nestedScrollView.fullScroll(ScrollView.FOCUS_UP);