Как прокрутить вверх до вершины макета ScrollView?

Для части моего приложения пользователю представлен список имен и предлагается сгруппировать их по своему усмотрению.

(Обратите внимание, что код ListView был скопирован дословно из учебника Android Views. Я еще не настроил его на свои нужды, я просто пытаюсь выяснить, как это сделать.)

Основной макет - LinearLayout, содержащий ScrollView (называемый "groupsScrollView" в коде ниже), содержащий RelativeLayout. У меня есть несколько кнопок и текст, а затем мой ListView под ним, который отображает список имен. Все это выше, чем видимая область экрана, поэтому пользователю разрешено прокручивать вертикально, чтобы увидеть все это.

Все это прекрасно работает, кроме случаев, когда страница загружается, она всегда предварительно прокручивается вверху моего ListView - в середине страницы. Текст и кнопки, которые я создал, которые говорят пользователю, что делать, не видны.

Я могу захватить экран и прокручивать вверх, это работает отлично, но я бы хотел, чтобы экран загружался уже прокручиваемым вверх. Пользователю не нужно прокручивать UP, чтобы увидеть верхнюю часть только что загруженной страницы. Но все, что я пытался программно прокрутить до верхней части экрана, не удалось.

Здесь мой метод 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, а затем программно прокрутить все это до верхней части страницы, чтобы пользователь мог взаимодействовать с ним?

Спасибо!

Ответ 1

Попробуйте

mainScrollView.fullScroll(ScrollView.FOCUS_UP);

он должен работать.

Ответ 2

Была та же проблема, вероятно, какая-то ошибка.

Даже fullScroll(ScrollView.FOCUS_UP) из другого ответа не работает.
Единственное, что сработало для меня, - это вызвать scroll_view.smoothScrollTo(0,0) сразу после показа диалогового окна.

Ответ 3

У меня была та же проблема, и это исправило это. Надеюсь, это поможет вам.

listView.setFocusable(false);

Ответ 4

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);
    }
});

Ответ 5

Основная проблема для всех этих действительных решений заключается в том, что вы пытаетесь переместить свиток, когда он еще не нарисован на экране.

Вам нужно подождать, пока на экране не появится прокрутка, а затем переместите его на любое из этих решений. Это лучшее решение, чем 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);
        }
    });

Ответ 6

Я столкнулся с такой же проблемой. Когда я использую Scrollview внутри View Flipper или Dialog, этот случай scrollViewObject.fullScroll(ScrollView.FOCUS_UP) возвращает false, так что для меня работает scrollViewObject.smoothScrollTo(0, 0)

Прокрутить фокус вверх

Ответ 7

Очень просто

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

Ответ 8

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

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

Ответ 9

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

Ответ 10

Это силовая прокрутка для scrollview:

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

Ответ 11

@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);
    }