Как прокрутить верхнюю часть длинного макета ScrollView? - PullRequest
150 голосов
/ 07 ноября 2010

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

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

Спасибо!

Ответы [ 13 ]

244 голосов
/ 23 января 2011

Попробуйте

mainScrollView.fullScroll(ScrollView.FOCUS_UP);

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

169 голосов
/ 20 мая 2012

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

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

95 голосов
/ 11 июля 2014

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

listView.setFocusable(false);
49 голосов
/ 17 мая 2013

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);
    }
});
33 голосов
/ 30 октября 2013

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

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

    // Wait until my scrollView is ready
    scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            // Ready, move up
            scrollView.fullScroll(View.FOCUS_UP);
        }
    });
28 голосов
/ 28 января 2016

Очень просто

    ScrollView scroll = (ScrollView) findViewById(R.id.addresses_scroll);
    scroll.setFocusableInTouchMode(true);
    scroll.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
24 голосов
/ 12 декабря 2012

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

Прокрутка Фокус сверху

20 голосов
/ 02 июля 2014
 final ScrollView scrollview = (ScrollView)findViewById(R.id.selected_place_layout_scrollview);

         scrollview.post(new Runnable() { 
                public void run() { 
                    scrollview.scrollTo(0, 0); 
                } 
            }); 
10 голосов
/ 26 февраля 2014
runOnUiThread( new Runnable(){
   @Override
   public void run(){
      mainScrollView.fullScroll(ScrollView.FOCUS_UP);
   }
}
5 голосов
/ 21 марта 2018

Это работает для меня

scroll_view.smoothScrollTo(0,0); // scroll to top of screen
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...