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

对于我的应用程序的一部分,用户会看到一个名称列表,并被要求按他们认为合适的方式进行分组。

(请注意,ListView代码是从Android Views教程逐字拷贝的,我还没有根据自己的需要进行定制,我只是想弄清楚如何使这个工作。)

基本布局是一个LinearLayout,包含一个ScrollView(在下面的代码中称为“groupsScrollView”),包含一个RelativeLayout。 我有一些button和文本,然后我的ListView下面,显示名称列表。 所有这些都比可见的屏幕区域更高,所以用户可以垂直滚动来查看。

这一切都工作得很好,除了当页面加载它总是预滚动到我的ListView的顶部 – 在页面的中间。 我创build的文本和button告诉用户该做什么是不可见的。

我可以抓住屏幕,向上滚动,这工作得很好,但我希望屏幕加载已经滚动到顶部。 用户不必向上滚动以查看新加载的页面的顶部。 但是,我试图以编程方式滚动到屏幕顶部的一切都失败了。

这是我的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的顶部。 这似乎得到了Google自己对scrollTo(int x,int y)方法的描述的确认,他们在这里说:“这个版本也限制了滚动到我们孩子的边界。”

因此,为了长时间地提出一个更长的问题,我该如何在ScrollView中包含的屏幕上加载一堆视图,然后以编程方式将整个视图滚动到页面的顶部,以便用户可以与之交互?

谢谢!

尝试

 mainScrollView.fullScroll(ScrollView.FOCUS_UP); 

它应该工作。

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

即使从其他答案fullScroll(ScrollView.FOCUS_UP)没有工作。
只有对我scroll_view.smoothScrollTo(0,0)东西是显示对话框后立即调用scroll_view.smoothScrollTo(0,0)

我有同样的问题,这固定它。 希望它可以帮助你。

 listView.setFocusable(false); 

scrollViewObject.fullScroll(ScrollView.FOCUS_UP)这工作正常,但只有这一行的问题是,当数据填充在scrollViewObject中,您立即调用。 你必须等待几毫秒,直到数据被填充。 试试这个代码:

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

要么

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

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

您需要等待滚动视图在屏幕上,然后将其移动到任何一个解决scheme。 这比后期延期更好,因为你不介意延迟。

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

我面临着同样的问题当我在视图的Flipper或对话框中使用scrollViewObject.fullScroll(ScrollView.FOCUS_UP)情况下scrollViewObject.fullScroll(ScrollView.FOCUS_UP)返回false,以便案例scrollViewObject.smoothScrollTo(0, 0)为我工作

滚动焦点顶部

好简单

  ScrollView scroll = (ScrollView) findViewById(R.id.addresses_scroll); scroll.setFocusableInTouchMode(true); scroll.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS); 
  final ScrollView scrollview = (ScrollView)findViewById(R.id.selected_place_layout_scrollview); scrollview.post(new Runnable() { public void run() { scrollview.scrollTo(0, 0); } }); 
 runOnUiThread( new Runnable(){ @Override public void run(){ mainScrollView.fullScroll(ScrollView.FOCUS_UP); } } 
 @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); } 

这是为scrollview强制滚动:

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