it-swarm.com.ru

Как прокрутить к началу длинного макета 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, который его содержит. Похоже, это подтверждается собственным описанием Google метода scrollTo (int x, int y), в котором говорится: «Эта версия также ограничивает прокрутку до границ нашего ребенка». 

Итак, чтобы сделать длинный вопрос еще длиннее, как я могу загрузить несколько представлений на экране, содержащихся в ScrollView, а затем программно прокрутить все это вверх страницы, чтобы пользователь мог взаимодействовать с ним?

Спасибо!

143
Glenn

Пытаться 

mainScrollView.fullScroll(ScrollView.FOCUS_UP);

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

237
roomtek

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

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

162
Mohamed Hafez

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

listView.setFocusable(false);
92
Miguel Palacios

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);
    }
});
47
Mohammad Imran

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

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

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

Очень просто

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

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

Scroll Focus Top

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

         scrollview.post(new Runnable() { 
                public void run() { 
                    scrollview.scrollTo(0, 0); 
                } 
            }); 
18
Mladen Rakonjac
runOnUiThread( new Runnable(){
   @Override
   public void run(){
      mainScrollView.fullScroll(ScrollView.FOCUS_UP);
   }
}
9
traeper

Это принудительная прокрутка для scrollview :

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

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

scroll_view.smoothScrollTo(0,0); // scroll to top of screen
4
Pankaj Talaviya
scrollView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        // Ready, move up
        scrollView.fullScroll(View.FOCUS_UP);
    }
});
2
user9271802
@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);
    }
0
Ajeet Gour