Я работаю над небольшим Android-приложением. Часть того, что мне нужно для этого приложения для Android, должно иметь сетку, которая имеет горизонтальную и вертикальную прокрутку. Однако крайний левый столбец необходимо заморозить (всегда на экране, а не в горизонтальной прокрутке). Аналогично, верхняя строка заголовка должна быть заморожена (не является частью вертикальной прокрутки)
Эта картина, мы надеемся, будет описать это ясно, если вышеизложенное не имеет особого смысла:
Key
- Белый: не прокручивать вообще
- Синий: прокрутка по вертикали
- Красный: прокрутка по горизонтали
- Фиолетовый: прокручивать как по вертикали, так и по горизонтали
Сделать одно из этих измерений достаточно просто, и я это сделал. Однако у меня возникают проблемы с тем, чтобы оба эти измерения работали. (т.е. я могу получить нижнюю часть, которая будет синей, или я могу получить правильную часть, чтобы она была красной, но не полностью, как указано выше). Код, который у меня есть, приведен ниже и будет в основном производить следующее:
result_grid.xml:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/lightGrey">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_below="@id/summaryTableLayout"
android:layout_weight="0.1"
android:layout_marginBottom="50dip"
android:minHeight="100dip">
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TableLayout
android:id="@+id/frozenTable"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginTop="2dip"
android:layout_marginLeft="1dip"
android:stretchColumns="1"
/>
<HorizontalScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/frozenTable"
android:layout_marginTop="2dip"
android:layout_marginLeft="4dip"
android:layout_marginRight="1dip">
<TableLayout
android:id="@+id/contentTable"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:stretchColumns="1"/>
</HorizontalScrollView>
</LinearLayout>
</ScrollView>
</LinearLayout>
<LinearLayout
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:orientation="vertical"
android:layout_weight="0.1"
android:layout_alignParentBottom="true">
<Button
android:id="@+id/backButton"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:text="Return"/>
</LinearLayout>
</RelativeLayout>
Код Java:
private boolean showSummaries;
private TableLayout summaryTable;
private TableLayout frozenTable;
private TableLayout contentTable;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.result_grid);
Button backButton = (Button)findViewById(R.id.backButton);
frozenTable = (TableLayout)findViewById(R.id.frozenTable);
contentTable = (TableLayout)findViewById(R.id.contentTable);
ArrayList<String[]> content;
// [Removed Code] Here I get some data from getIntent().getExtras() that will populate the content ArrayList
PopulateMainTable(content);
}
private void PopulateMainTable(ArrayList<String[]> content) {
// [Removed Code] There is some code here to style the table (so it has lines for the rows)
for (int i = 0; i < content.size(); i++){
TableRow frozenRow = new TableRow(this);
// [Removed Code] Styling of the row
TextView frozenCell = new TextView(this);
frozenCell.setText(content.get(i)[0]);
// [Removed Code] Styling of the cell
frozenRow.addView(frozenCell);
frozenTable.addView(frozenRow);
// The rest of them
TableRow row = new TableRow(this);
// [Renoved Code] Styling of the row
for (int j = 1; j < content.get(0).length; j++) {
TextView rowCell = new TextView(this);
rowCell.setText(content.get(i)[j]);
// [Removed Code] Styling of the cell
row.addView(rowCell);
}
contentTable.addView(row);
}
}
Это выглядит так:
Итак, это то, что похоже на немного горизонтальной прокрутки
Это то, что выглядит при прокрутке по вертикали, обратите внимание, что вы теряете заголовки! Это проблема!
Два последних примечания!
Во-первых, я не могу поверить, что этого уже не существует. (У меня нет Android, поэтому я не смог оглянуться на приложения, которые могут это сделать). Тем не менее, я искал, по крайней мере, два дня в StackOverflow и в Интернете в целом, ища решение для GridView или TableLayout, которое предоставит мне то, что я хотел бы сделать, и еще не нашел решение. Как смущенный, поскольку я был бы за то, что пропустил его, если кто-то знает о ресурсе, который описывает, как это сделать, я был бы благодарен!
Во-вторых, я попытался "принудительно" решить это, добавив два LinearLayouts, один из которых захватил часть "Заголовка" сетки, которую я хочу создать, а другую для нижней "контентной" части сетку, которую я хочу создать. Я могу опубликовать этот код, но это уже довольно долго, и я надеюсь, что то, что я имею в виду, очевидно. Это частично сработало, но проблема здесь в том, что заголовки и столбцы контента никогда не выстраивались в линию. Я хотел использовать getWidth() и setMinimumWidth() в TextViews в TableRows, но, как описано здесь, эти данные были недоступны во время onCreate (а также были недоступны внутри onPostCreate), Я не смог найти способ заставить это работать, и решение в этой области тоже было бы замечательно!
Если вы сделали это так далеко до конца, то вам очень понравится!