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
Спасибо заранее!
Ответы
Ответ 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>