Для части моего приложения пользователю предоставляется список имен, и ему предлагается сгруппировать их по своему усмотрению.
(Обратите внимание, что код 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, а затем программно прокрутить все это вверх страницы, чтобы пользователь мог взаимодействовать с ним?
Спасибо!
источник
Была такая же проблема, вероятно, какая-то ошибка.
Даже
fullScroll(ScrollView.FOCUS_UP)
другой ответ не сработал.Единственная вещь, которая работала для меня, звонила
scroll_view.smoothScrollTo(0,0)
сразу после показа диалога.источник
fullScroll()
тем, что выбранный элемент остается выбранным после перемещения. СfullScroll()
помощью первый элемент в просмотре прокрутки каждый раз перевыбирался в моем случае независимо от выбранного элемента до того, как прокрутка переместилась вверх.У меня была такая же проблема, и это решило ее. Надеюсь, это поможет вам.
источник
scrollViewObject.fullScroll(ScrollView.FOCUS_UP)
это работает нормально, но проблема заключается только в том, что при заполнении данных в scrollViewObject вызывается немедленно. Вам нужно подождать несколько миллисекунд, пока данные не будут заполнены. Попробуйте этот код:ИЛИ
источник
Основная проблема всех этих правильных решений заключается в том, что вы пытаетесь переместить прокрутку вверх, когда она еще не нарисована на экране.
Вам нужно подождать, пока на экране не появится вид прокрутки, а затем переместить его в любое из этих решений. Это лучшее решение, чем пост-задержка, потому что вы не против задержки.
источник
onGlobalLayout
вызова методаscrollView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
Очень просто
источник
onCreate()
.Я столкнулся с той же проблемой, когда я использую Scrollview внутри View Flipper или Dialog, этот случай
scrollViewObject.fullScroll(ScrollView.FOCUS_UP)
возвращает false, так что случайscrollViewObject.smoothScrollTo(0, 0)
работает для меняВерхняя часть с прокруткой
источник
источник
источник
Это работает для меня
источник
Это принудительная прокрутка для scrollview :
источник
источник
Я исправил свою проблему в Kotlin следующим образом:
источник
источник