it-swarm.com.ru

Android Строка заголовка TableLayout

Итак, у меня есть этот TableLayout, и он полон данных - со всеми строками, добавленными программно. У меня есть TableLayout внутри HorizontalScrollView, который, в свою очередь, находится внутри ScrollView - это дает мне прокрутку как по горизонтали, так и по вертикали. Сейчас я пытаюсь добавить строку заголовка, которая не будет прокручиваться. Я попытался переместить вещи так, чтобы оба моих представления прокрутки были на самом деле внутри TableLayout и добавили TableRows к HorizontalScrollView; Я надеялся, что смогу добавить строку заголовка за пределы прокрутки.

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

12
Jeff Barger

Один из подходов заключается в встраивании TableLayout в строку другого TableLayout и размещении заголовка в предыдущей строке, как показано ниже. Для выравнивания данных и заголовка необходимо, чтобы свойство layout_width заголовочных объектов View и объектов View данных были установлены на одинаковые значения dip. Кроме того, свойство layout_weight внутренних объектов View в TableLayout должно соответствовать соответствующему заголовку. Теперь, в приведенном ниже XML-коде, я поместил 3 TextView во внутреннем TableLayout в одну строку, чтобы соответствовать заголовкам столбцов. Это просто, чтобы показать, как выравнивание может быть сделано. Вы можете заполнить эти данные программно, надувая макет и добавляя его во время выполнения.

<?xml version="1.0" encoding="utf-8"?>
<TableLayout
  xmlns:Android="http://schemas.Android.com/apk/res/Android"
  Android:layout_width="fill_parent"
  Android:layout_height="fill_parent">


  <TableRow>
    <TextView Android:text="Name"
        Android:layout_width="100dp"        
        Android:layout_column="0"
        Android:layout_weight="1"/>
    <TextView Android:text="Score"
        Android:layout_width="30dp"
        Android:layout_column="1"
        Android:layout_weight="1">
    </TextView>
    <TextView Android:text="Level"
        Android:layout_width="30dp"
        Android:layout_column="2"
        Android:layout_weight="1">
    </TextView>
  </TableRow>

    <ScrollView Android:layout_height="120dp">      
    <TableLayout Android:id="@+id/score_table"
      Android:layout_width="fill_parent"
      Android:layout_height="fill_parent">          
    <TableRow>
        <TextView Android:text="Al"
        Android:layout_width="100dp"        
        Android:layout_column="0"
        Android:layout_weight="1">
        </TextView>
        <TextView Android:text="1000"
        Android:layout_width="30dp"
        Android:layout_column="1"
        Android:layout_weight="1">
        </TextView>
        <TextView Android:text="2"
        Android:layout_width="30dp"
        Android:layout_column="2"
        Android:layout_weight="1">
        </TextView>
    </TableRow>
  </TableLayout>
  </ScrollView>     
</TableLayout>
12
WindsurferOak

Я действительно придумал другой приличный способ сделать это.

Просто создайте таблицу, как правило, с строкой заголовка в качестве первой строки внутри вертикальной ориентации LinearLayout. Затем программно удалите первую строку, затем добавьте ее в качестве первого дочернего элемента в LinearLayout. Это работает как шарм.

Правка: это также работает без указания статической ширины столбца.

13
khendricks

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

Идея: поместите TableLayout (внутри ScrollView) в RelativeLayout и создайте оверлей, который будет рисовать первую строку (заголовок) поверх всего остального.

Вот layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"

    Android:id="@+id/table_wrapper"

    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
>
    <ScrollView

        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"

        tools:ignore="UselessParent"
    >
        <TableLayout

            Android:id="@+id/table"

            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
        />
    </ScrollView>
</RelativeLayout>

И вот код:

TableLayout table = (TableLayout)view.findViewById(R.id.table);

final TableRow headerRow = new TableRow(context);
table.addView(headerRow);

table.addView(new TableRow(context));
table.addView(new TableRow(context));
table.addView(new TableRow(context));


RelativeLayout tableWrapper = (RelativeLayout)view.findViewById(R.id.table_wrapper);

View fakeHeaderView = new View(context) {
    @Override
    public void draw(Canvas canvas) {
        headerRow.draw(canvas);
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int width = headerRow.getMeasuredWidth();
        int height = headerRow.getMeasuredHeight();

        widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
};

tableWrapper.addView(fakeHeaderView);
3
Oleg Skrypnyuk

Для тех, кто не в восторге от необходимости заранее определять свои размеры, я нашел кое-что, что работает для меня.

По сути, создайте отдельную таблицу для заголовка и поместите ее над основной таблицей, но с тем же выравниванием по верху, затем создайте две копии строки заголовка и после добавления одной в основную таблицу добавьте другую в таблицу заголовков и установите layoutParams дочернего представления в строке образуют основную таблицу.

Вот мой основной пример.

в вашем макете:

<HorizontalScrollView
    Android:id="@+id/table_horizontal_scroll_view"
    Android:layout_alignParentTop="true"
    Android:layout_width="wrap_content"
    Android:layout_height="match_parent"
    Android:clickable="false">

    <RelativeLayout
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        >

        <ScrollView
            Android:layout_alignParentTop="true"
            Android:layout_marginTop="0dp"
            Android:id="@+id/table_vertical_scroll_view"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content">

            <TableLayout
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:id="@+id/grid_table_layout"
                />

        </ScrollView>

        <TableLayout
            Android:layout_alignLeft="@+id/table_vertical_scroll_view"
            Android:layout_alignRight="@+id/table_vertical_scroll_view"
            Android:layout_alignStart="@+id/table_vertical_scroll_view"
            Android:layout_alignEnd="@+id/table_vertical_scroll_view"
            Android:layout_alignParentTop="true"
            Android:background="@color/grid_view_background"
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:id="@+id/grid_floating_row_layout"
            />

    </RelativeLayout>


</HorizontalScrollView>

Затем, когда вы добавляете свои строки:

    //clear out any views
    tableLayout.removeAllViews();
    floatingRowLayout.removeAllViews();

    TableRow[] rows = getTableContentRows() // content of your table
    TableRow[] titleRows = {getTitleRow(), getTitleRow()}; //two copies of your title row
    tableLayout.addView(titleRows[0]); // first add the first title to the main table
    addRows(rows) // add any other rows

    floatingRowLayout.addView(titleRows[1]); // floatingRowLayout is connected to id/grid_floating_row_layout

    titleRows[0].setVisibility(View.INVISIBLE); // make the title row added to the main table invisible

    // Set the layoutParams of the two title rows equal to each other. 
    // Since this is done after the first is added to the main table, they should be the correct sizes.
    for(int i = 0; i < titleRows[0].getChildCount(); i++) {
      titleRows[1].getChildAt(i).setLayoutParams(titleRows[0].getChildAt(i).getLayoutParams());
    }
0
PeejWeej

Используйте Two tableLayout One в ScrollView, как, например, give Android:stretchColumns="*"

   <RelativeLayout
            Android:layout_width="match_parent"
            Android:orientation="vertical"
            Android:paddingTop="5dp"
            Android:layout_height="match_parent"
            Android:layout_below="@+id/llSpinner">
            <TableLayout
                Android:layout_width="match_parent"
                Android:id="@+id/tableHead"
Android:stretchColumns="*" 
                Android:layout_height="wrap_content">
            </TableLayout>

        <ScrollView
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_above="@+id/tableTotal"
            Android:layout_below="@+id/tableHead"
            Android:id="@+id/scrolltable">


        </ScrollView>
    <TableLayout
                Android:layout_width="match_parent"
                Android:id="@+id/tableTotal"
Android:stretchColumns="*" 
                Android:layout_alignParentBottom="true"
                Android:layout_height="wrap_content">
            </TableLayout>
        </RelativeLayout>

затем создайте общий вид для строк и самое важное упоминание Android:layout_width="0dp"

<TableRow
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="fill_parent"
    Android:layout_height="?android:attr/listPreferredItemHeight"
    Android:focusable="true"
    Android:focusableInTouchMode="false"
    Android:clickable="true"
    Android:background="@Android:drawable/list_selector_background">

    <TextView
        Android:text="S.No"
        Android:layout_width="0dp"
        Android:layout_height="wrap_content"
        Android:id="@+id/tbsNo"
        Android:layout_weight="1"
        Android:gravity="center"
        Android:layout_column="1" />

    <TextView
        Android:layout_width="0dp"
        Android:layout_height="wrap_content"
        Android:text="Date"
        Android:layout_weight="1"
        Android:gravity="center"
        Android:id="@+id/tbDate"
        Android:layout_column="2" />


    <TextView
        Android:layout_width="0dp"
        Android:layout_height="wrap_content"
        Android:text="Count"
        Android:layout_weight="1"
        Android:gravity="center"
        Android:id="@+id/tbMrCount"
        Android:layout_column="3" />
</TableRow>

Сейчас в деятельности

 Tablelayout tableHeading =(TableLayout)findViewById(R.id.tableHead);


               Tablelayout    table =(TableLayout) findViewById(R.id.table_repots);
                   trHeading = (TableRow) getLayoutInflater().inflate(R.layout.table_row_item, null);
                trHeading.setBackgroundColor(Color.parseColor("#6688AC"));
                trHeading.setPadding(0,10,0,10);

                TextView tv;
                tv = (TextView) trHeading.findViewById(R.id.tbsNo);
                tv.setText("S.No");
            tv = (TextView) trHeading.findViewById(R.id.tbDate);
           tv.setText("Date");
          table.addView(tv);
0
Kapil Parmar