Intereting Posts
Java Импорт com.google не может быть разрешен Android "hello world" пример pushnotification Каков предел переменных SQL, которые можно указать в одном запросе execSQL ScrollBar в listView … настраивая его. Получение сообщения об ошибке «Ресурс не является общедоступным» Android 6.0 – удаляются внешние файлы для хранения при удалении приложения Android – Исправлена ​​ориентация экрана только для 1 страницы (телефонная задержка) В чем преимущество использования SQLite, а не файла? Как добавить простой заголовок / нижний колонтитул 8dp в Android RecyclerView? Предотвращение разрушения активности Проект с path ': mypath' не найден в корневом проекте 'myproject' Пользовательский аутентификатор учетной записи. Очистка после удаления учетной записи с устройства Android java Binder FAILED SACTION TRANSACTION? Как я могу нарисовать вертикальную линию в Activity при нажатии кнопки? Дублирующий класс WebRTC в android

Прокрутите до последней строки TableLayout в ScrollView

Я хочу иметь динамическую таблицу со строками, добавленными со временем в результате взаимодействия с пользователем, используя TableLayout внутри ScrollView. Это работает отлично, но когда я хочу прокрутить до конца таблицы с помощью функции fullScroll() , она всегда не fullScroll() последнюю строку; То есть, она прокручивается так, чтобы вид был показан до последнего. Последняя строка видна при прокрутке вручную, а также в полосе прокрутки.

Я, конечно, открыт для предложений о том, как сделать лучший макет из этого; Но мне особенно интересно понять, почему так работает fullScroll() . Должен ли я дать ему другой параметр или использовать что-то еще? Или он делает это, потому что недавно добавленная линия еще не видна? (Если да, то как я могу это решить?) Или я пропустил еще одну очевидную вещь?

Следующий код реплицирует проблему:

TestActivity.java:

 package com.example.android.tests; import java.util.Random; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ScrollView; import android.widget.TableLayout; import android.widget.TableRow; import android.widget.TextView; public class TestActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ((Button) findViewById(R.id.AddRow)).setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Random rnd = new Random(); TableRow nr = new TableRow(v.getContext()); for (int c=0; c<3; c++) { TextView nv = new TextView(v.getContext()); nv.setText(Integer.toString(rnd.nextInt(20)-10)); nr.addView(nv); } ((TableLayout) findViewById(R.id.Table)).addView(nr); // Scrolls to line before last - why? ((ScrollView) findViewById(R.id.TableScroller)).fullScroll(View.FOCUS_DOWN); } }); } } 

main.xml:

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:text="Add Row" android:id="@+id/AddRow" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" /> <ScrollView android:id="@+id/TableScroller" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_above="@id/AddRow" android:layout_alignParentTop="true" > <TableLayout android:id="@+id/Table" android:layout_width="fill_parent" android:layout_height="wrap_content" android:stretchColumns="0,1,2" /> </ScrollView> </RelativeLayout> 

Изменить: для справки я применил решение Ромен Гая следующим образом:

В TestActivity.java замените:

  // Scrolls to line before last - why? ((ScrollView) findViewById(R.id.TableScroller)).fullScroll(View.FOCUS_DOWN); 

с:

  // Enqueue the scrolling to happen after the new row has been layout ((ScrollView) findViewById(R.id.TableScroller)).post(new Runnable() { public void run() { ((ScrollView) findViewById(R.id.TableScroller)).fullScroll(View.FOCUS_DOWN); } }); 

Это прекрасно работает.

Solutions Collecting From Web of "Прокрутите до последней строки TableLayout в ScrollView"

В то время, когда вы выполняете свой fullScroll (), макет еще не выполнен, поэтому ScrollView использует «старый» размер для таблицы. Вместо прямого вызова функции fullScroll () используйте View.post (Runnable).

Найти подсказку выше полезной, вот простая реализация, которая прокручивает ScrollView, чтобы сделать данный ребенок видимым …

A: Подготовьте следующий вспомогательный класс

 public class ScrollToTrick implements Runnable { ScrollView scroller; View child; ScrollToTrick(ScrollView scroller, View child) { this.scroller=scroller; this.child=child; } public void run() { scroller.scrollTo(0, child.getTop()); } } 

Б) называть это так

 my_scroller.post(new ScrollToTrick(my_scroller,child_to_scroll_to) );