Я хочу иметь динамическую таблицу, со строками, добавляемыми со временем в результате взаимодействия с пользователем, с помощью TableLayout в ScrollView. Это хорошо работает, но когда я хочу прокрутить в конец использования таблицы 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:
Править: для ссылки я реализовал решение Romain Guy следующим образом:
В 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);
}
});
Который хорошо работает.
В то время, когда вы выполняете fullScroll (), макет еще не создан, поэтому ScrollView использует "старый" размер для таблицы. Вместо того, чтобы сразу вызывать fullScroll (), используйте View.post (Runnable).