Подтвердить что ты не робот

Android GridView загружает элементы по вертикали

Можно ли загружать элементы в GridView с вертикальной ориентацией? Я имею в виду...

Нормальная ситуация - 3 столбца

enter image description here

-----------------------------             
1      |  2      |    3
-----------------------------
4      |  5      |    6

enter image description here

Требуемая ситуация - 3 столбца

-----------------------------              
1      |  3      |    5
-----------------------------
2      |  4      |    6

Спасибо заранее!

4b9b3361

Ответ 1

Я не думаю, что это возможно вообще.

Причина::

  • Существует технический сбой, потому что мы хотим прокручивать элементы по вертикали. А также элементы рендеринга на экране также имеют вертикальное направление. В этом случае мы не сможем завершить расчет, который нам нужно сделать в методе onLayout и onMeasure GridView.
  • Если попробуйте другой способ, то есть некоторые из нас предположили, что сопкуют источник данных как [1,5,2,6,3,7,4,8,...], но в этом случае будет алгоритм перетасовки?
  • Когда пользователь перемещается вертикально, как вы можете рассчитать, сколько элементов нужно визуализировать вертикально, и когда нужно переключиться на следующий столбец, чтобы отобразить другие объекты. для нее нет такой математической формулы.

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

Ответ 2

Просьба пояснить, скажем, у вас есть такая сетка

1  4  7
2  5  8
3  6  9

теперь, если вы прокрутите его вниз по вертикали, в основном это будет выглядеть так:

2  5  8
3  6  9
4  7  10

В этом случае

  • элементы 4 и 7 не перерабатываются, на самом деле они перемещаются в новую позицию.
  • элемент 1 должен быть переработан.
  • вводится только элемент 10

Ясно, что это не так, как работает обычный ListView/GridView, когда строка перерабатывается за один раз, AFAIK вам нужно настроить GridView, чтобы получить эту функциональность.

Ответ 3

Можно ли изменить последовательность данных? В вашем примере измените данные на [1,3,5,2,4,6,...] для горизонтальной ориентации [1,5,2,6,3,7,4,8,...] для вертикальная ориентация.

Ответ 4

//Вы когда-нибудь использовали GridLayout this, попробуйте следующее:

File -> Import -> <sdk_folder>\extras\android\support\v7\gridlayout>

//Добавьте этот проект в проект библиотеки

//xml файл - activity_main.xml

<android.support.v7.widget.GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/gridLayout"
    tools:context="com.example.gridlayoutdemo.MainActivity" >

</android.support.v7.widget.GridLayout>

//Код Java

MainActivity.class

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.GridLayout;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {

    private GridLayout gridLayout;
    private TextView[] textViews;
    private int noOfItems;

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

        gridLayout = (GridLayout) findViewById(R.id.gridLayout);
        gridLayout.setOrientation(1);
        gridLayout.setColumnCount(3);
        gridLayout.setRowCount(3);

        textViews = new TextView[8];

        for (int i = 0; i < 8; i++) {
            textViews[i] = new TextView(MainActivity.this);
            textViews[i].setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
                    LayoutParams.WRAP_CONTENT));
            textViews[i].setText(String.valueOf(i));
            textViews[i].setTextSize(25);
            textViews[i].setPadding(50, 25, 10, 25);
            gridLayout.addView(textViews[i]);
        }

        setContentView(gridLayout);

        for (noOfItems = 0; noOfItems < 8; noOfItems++) {
            textViews[noOfItems].setOnClickListener(new View.OnClickListener() {

                int pos = noOfItems;

                public void onClick(View v) {
                    Toast.makeText(getBaseContext(), pos + " Clicked",
                            Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

}

//Если вы хотите отображать горизонтально, чем это сделать gridLayout.setOrientation(0);

Ответ 5

Думаю, вам нужно https://github.com/ApmeM/android-flowlayout. и установите вес ребенка на Gravity.FILL_HORIZONTAL

они даже имеют ориентацию vertical или horizontal

Ответ 6

Если вы используете GridLayoutManager с RecyclerView, простой способ заполнить вертикальные данные сначала:

GridLayoutManager lLayout_artist = new GridLayoutManager(getActivity(),3,GridLayoutManager.HORIZONTAL, false);

Вы можете изменить ориентацию GridLayoutManager в соответствии с вашими требованиями.

Ответ 7

Вы можете достичь этого, используя GridLayout вместо GridView.

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="wrap_content"
       android:layout_height="match_parent"
       android:orientation="vertical"
       android:rowCount="2">
</GridLayout>