Как я могу сделать динамически генерируемую таблицу с прокруткой? - PullRequest
0 голосов
/ 23 января 2019

У меня есть 3 фрагмента внутри Activity, и в двух из фрагментов у меня есть жестко TableLayout внутри ConstraintLayout, заголовки и строки таблиц динамически генерируются с информацией из сервера MySQL. Учитывая динамический характер, таблица может переполнять страницу, и я хочу, чтобы она была прокручиваемой.

В StackOverflow уже есть несколько вопросов, где люди хотели прокручиваемую таблицу, но в вопросах таблицы и их данные жестко закодированы (не знаю, уместно ли это или нет). Я попробовал решения, предложенные в этих вопросах, но они не работают на моем столе. Решения обычно заключаются в том, чтобы либо обернуть TableLayout в ScrollView, либо использовать android:isScrollContainer="1", ни один из которых не сработал для меня.

TableLayout внутри ScrollView. ScrollView предназначен для тестирования, обычно это просто TableLayout.

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ViewProductLocFragment">
    <!-- Rest of the fragment -->

    <ScrollView
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="16dp"
        android:layout_weight="1"
        android:scrollbars="none"
        app:layout_constraintBottom_toTopOf="@+id/menuBar"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/view">

        <TableLayout
            android:id="@+id/tableLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="5dp"
            android:layout_marginTop="5dp"
            android:layout_marginEnd="5dp"
            android:layout_marginBottom="5dp"
            android:stretchColumns="*"
            app:layout_constraintBottom_toTopOf="@+id/menuBar"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/view">
        </TableLayout>
    </ScrollView>

</android.support.constraint.ConstraintLayout>

Вот код, заполняющий таблицу.

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.fragment_view_product_main, container, false);
    initializeTableLayout(view);
    fillTable(((ViewProductActivity)getActivity()).pallets);

    return view;
}

private void fillTable(PalletsResult pallets)
{
    Integer count = 0;
    for(Pallet pallet : pallets.getPallets()) {

        String barcode = pallet.getBarcode();
        String location = pallet.getCode();
        Integer quantity = pallet.getQuantity();

        TableRow tableRow = new TableRow(getContext());
        if (count % 2 != 0) {
            tableRow.setBackgroundColor(getResources().getColor(R.color.lightGrey));
        }
        tableRow.setId(View.generateViewId());
        tableRow.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

        TextView labelBarcode = new TextView(getContext());
        labelBarcode.setId(View.generateViewId());
        labelBarcode.setGravity(Gravity.CENTER);
        labelBarcode.setTextColor(getResources().getColor(R.color.standardTextColor));
        labelBarcode.setTextSize(18);
        labelBarcode.setText(barcode);
        tableRow.addView(labelBarcode);

        TextView labelLocation = new TextView(getContext());
        labelLocation.setId(View.generateViewId());
        labelLocation.setGravity(Gravity.CENTER);
        labelLocation.setTextColor(getResources().getColor(R.color.standardTextColor));
        labelLocation.setTextSize(18);
        labelLocation.setText(location);
        tableRow.addView(labelLocation);

        TextView labelQuantity = new TextView(getContext());
        labelQuantity.setId(View.generateViewId());
        labelQuantity.setGravity(Gravity.CENTER);
        labelQuantity.setTextColor(getResources().getColor(R.color.standardTextColor));
        labelQuantity.setTextSize(18);
        labelQuantity.setText(quantity.toString());
        tableRow.addView(labelQuantity);

        tableLayout.addView(tableRow, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        count++;
    }
}

private void initializeTableLayout(View view)
{
    tableLayout = view.findViewById(R.id.tableLayout);
    TableRow tr_head = new TableRow(getContext());
    tr_head.setId(View.generateViewId());
    tr_head.setBackgroundColor(getResources().getColor(R.color.lightGrey));
    tr_head.setLayoutParams(new LayoutParams(
        LayoutParams.MATCH_PARENT,
        LayoutParams.WRAP_CONTENT
        ));

    TextView label_barcode = new TextView(getContext());
    label_barcode.setId(View.generateViewId());
    label_barcode.setText("BARCODE");
    label_barcode.setTextSize(20);
    label_barcode.setTextColor(Color.BLACK);
    label_barcode.setGravity(Gravity.CENTER);
    tr_head.addView(label_barcode);// add the column to the table row here

    TextView label_location = new TextView(getContext());
    label_location.setId(View.generateViewId());// define id that must be 
unique
    label_location.setText("LOCATION"); // set the text for the header
    label_location.setTextSize(20);
    label_location.setTextColor(Color.BLACK); // set the color
    label_location.setGravity(Gravity.CENTER);
    tr_head.addView(label_location); // add the column to the table row here

    TextView label_quantity = new TextView(getContext());
    label_quantity.setId(View.generateViewId());// define id that must be 
unique
    label_quantity.setText("QTY"); // set the text for the header
    label_quantity.setTextSize(20);
    label_quantity.setTextColor(Color.BLACK); // set the color
    label_quantity.setGravity(Gravity.CENTER);
    tr_head.addView(label_quantity); // add the column to the table row here

    tableLayout.setScrollContainer(true);
    tableLayout.addView(tr_head, new TableLayout.LayoutParams(
    LayoutParams.MATCH_PARENT,
    LayoutParams.WRAP_CONTENT));
}

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

Существует довольно много другого кода, который я не опубликовал в отношении Деятельности, содержащей фрагменты, а что нет. Дайте мне знать, если вы хотите что-нибудь из этого.

Спасибо за любую помощь.

Обновление: Я реализовал похожую таблицу в другом месте моего приложения, и она прекрасно работала с кодом, размещенным в моих примерах. Это означает, что моя проблема связана с тем, что таблица находится во фрагменте, а не в активности. Я опубликую часть моего фрагмента кода позже.

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Вы можете использовать Библиотека TableView , чтобы сделать таблицу прокручиваемой с динамическими данными.Ссылка приведена ниже: -
https://github.com/evrencoskun/TableView

0 голосов
/ 23 января 2019

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

MainActivity.java

public class MainActivity extends Activity {

TableLayout tableLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    initializeTableLayout();

}


@Override
protected void onResume() {
    super.onResume();

    fillTable();
}

private void fillTable() {
    Integer count = 0;
    for (int i = 0; i < 100; i++) {

        String barcode = "#0000000000";
        String location = "Location";
        Integer quantity = 1;

        TableRow tableRow = new TableRow(MainActivity.this);
        if (count % 2 != 0) {
            tableRow.setBackgroundColor(getResources().getColor(android.R.color.darker_gray));
        }
        tableRow.setId(View.generateViewId());
        tableRow.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

        TextView labelBarcode = new TextView(MainActivity.this);
        labelBarcode.setId(View.generateViewId());
        labelBarcode.setGravity(Gravity.CENTER);
        labelBarcode.setTextColor(getResources().getColor(R.color.colorAccent));
        labelBarcode.setTextSize(18);
        labelBarcode.setText(barcode);
        tableRow.addView(labelBarcode);

        TextView labelLocation = new TextView(MainActivity.this);
        labelLocation.setId(View.generateViewId());
        labelLocation.setGravity(Gravity.CENTER);
        labelLocation.setTextColor(getResources().getColor(R.color.colorAccent));
        labelLocation.setTextSize(18);
        labelLocation.setText(location);
        tableRow.addView(labelLocation);

        TextView labelQuantity = new TextView(MainActivity.this);
        labelQuantity.setId(View.generateViewId());
        labelQuantity.setGravity(Gravity.CENTER);
        labelQuantity.setTextColor(getResources().getColor(R.color.colorAccent));
        labelQuantity.setTextSize(18);
        labelQuantity.setText(quantity.toString());
        tableRow.addView(labelQuantity);

        tableLayout.addView(tableRow, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        count++;
    }
}

private void initializeTableLayout() {
    tableLayout = this.findViewById(R.id.tableLayout);
    TableRow tr_head = new TableRow(MainActivity.this);
    tr_head.setId(View.generateViewId());
    tr_head.setBackgroundColor(getResources().getColor(android.R.color.darker_gray));
    tr_head.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

    TextView label_barcode = new TextView(MainActivity.this);
    label_barcode.setId(View.generateViewId());
    label_barcode.setText("BARCODE");
    label_barcode.setTextSize(20);
    label_barcode.setTextColor(Color.BLACK);
    label_barcode.setGravity(Gravity.CENTER);
    tr_head.addView(label_barcode);// add the column to the table row here

    TextView label_location = new TextView(MainActivity.this);
    label_location.setId(View.generateViewId());// define id that must be         unique
    label_location.setText("LOCATION"); // set the text for the header
    label_location.setTextSize(20);
    label_location.setTextColor(Color.BLACK); // set the color
    label_location.setGravity(Gravity.CENTER);
    tr_head.addView(label_location); // add the column to the table row here

    TextView label_quantity = new TextView(MainActivity.this);
    label_quantity.setId(View.generateViewId());// define id that must be         unique
    label_quantity.setText("QTY"); // set the text for the header
    label_quantity.setTextSize(20);
    label_quantity.setTextColor(Color.BLACK); // set the color
    label_quantity.setGravity(Gravity.CENTER);
    tr_head.addView(label_quantity); // add the column to the table row here

    tableLayout.setScrollContainer(true);
    tableLayout.addView(tr_head, new TableLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
}

}

activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginStart="8dp"
        android:layout_marginTop="16dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="16dp"
        android:layout_weight="1"
        android:scrollbars="none">

        <TableLayout
            android:id="@+id/tableLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="5dp"
            android:layout_marginTop="5dp"
            android:layout_marginEnd="5dp"
            android:layout_marginBottom="5dp"
            android:stretchColumns="*"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"></TableLayout>
    </ScrollView>

</android.support.constraint.ConstraintLayout>

Я вручную добавил 100 фиктивных строк, чтобы проверить его поведение при прокрутке, и хотел бы сообщить вам, что он работает точно так, как должен. Возможно, в родительском коде Activity или Fragment возникла проблема, которая препятствует прокрутке таблицы.

...