Горизонтальная и вертикальная прокрутка GridView Android - PullRequest
0 голосов
/ 12 февраля 2019

Я создаю компонент, используя GridView для создания таблицы, такой как Excel.Здесь я сначала создаю сетку 2x2, а затем, когда пользователь нажимает кнопку, добавляется дополнительная строка и столбец.

Вот что я делаю, чтобы добавить новый столбец: -

int numColumns = GVParticipantTable.getNumColumns() + 1;
                double numRows = Math.ceil((double) GVParticipantTable.getCount() / (double) GVParticipantTable.getNumColumns());
                int totalItems = (int) numRows * numColumns;

                if (participantDataList.size() > 4)
                {
                    totalItems = totalItems - participantDataList.size();
                }
                for (int i = 0; i < totalItems; i++)
                {
                    participantDataList.add("");

                }

                GVParticipantTable.setNumColumns(numColumns);
                mAdapterParticipantTable.notifyDataSetChanged();

Это прекрасно работает и добавляет дополнительный столбец.Проблема заключается в том, что при добавлении столбца предыдущие столбцы сжимаются для размещения нового столбца, в результате чего столбцы выглядят меньше при каждом добавлении нового столбца.Я хочу, чтобы на экране одновременно отображались только 2 столбца, а затем позвольте пользователю прокручиваться вперед по горизонтали, чтобы увидеть больше столбцов.Прямо сейчас сетка может прокручиваться только вертикально.Точно так же я хочу, чтобы это происходило при добавлении новых строк, чтобы пользователь мог прокручивать по вертикали, чтобы увидеть больше строк.

1 Ответ

0 голосов
/ 12 февраля 2019

Согласно тому, что я знаю, вы никогда не должны использовать HorizontalScrollView с ListView, так как ListView заботится о своей собственной прокрутке.Что наиболее важно, выполнение этого снимает все важные оптимизации в ListView для работы с большими списками, поскольку он фактически заставляет ListView отображать весь список элементов, чтобы заполнить бесконечный контейнер, предоставленный HorizontalScrollView.

http://developer.android.com/reference/android/widget/HorizontalScrollView.html

Поскольку вас могут заставить использовать двухмерный вид прокрутки, вы можете рассмотреть возможность использования этого: Интернет-архив blog.gorges.us/2010/06/android-two-dimensional-scrollview/

Я не использовал это, но это может быть разумным подходом.

Возможно, попробуйте, добавив это в свой XML-файл и в свой JAVA

<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/scrollHorizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ScrollView 
        android:id="@+id/scrollVertical"
        android:layout_width="wrap_content"
        android:layout_height="match_parent" >

        //WateverViewYouWant

    </ScrollView>
</HorizontalScrollView>

И код onCreate / onCreateView

final HorizontalScrollView hScroll = (HorizontalScrollView) value.findViewById(R.id.scrollHorizontal);
    final ScrollView vScroll = (ScrollView) value.findViewById(R.id.scrollVertical);
    vScroll.setOnTouchListener(new View.OnTouchListener() { //inner scroll listener         
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return false;
        }
    });
    hScroll.setOnTouchListener(new View.OnTouchListener() { //outer scroll listener         
        private float mx, my, curX, curY;
        private boolean started = false;

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            curX = event.getX();
            curY = event.getY();
            int dx = (int) (mx - curX);
            int dy = (int) (my - curY);
            switch (event.getAction()) {
                case MotionEvent.ACTION_MOVE:
                    if (started) {
                        vScroll.scrollBy(0, dy);
                        hScroll.scrollBy(dx, 0);
                    } else {
                        started = true;
                    }
                    mx = curX;
                    my = curY;
                    break;
                case MotionEvent.ACTION_UP: 
                    vScroll.scrollBy(0, dy);
                    hScroll.scrollBy(dx, 0);
                    started = false;
                    break;
            }
            return true;
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...