GridView - иногда строки выровнены сверху, иногда они выровнены по нижнему краю!
Я использую GridView. Четыре элемента в столбце. Каждый элемент состоит из следующего макета:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:layout_width="32dip"
android:layout_height="32dip"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="11dip"
android:paddingTop="2dip" />
</LinearLayout>
Таким образом, каждый элемент представляет собой небольшое изображение с небольшим количеством текста под ним. Макет отлично работает на первом проходе. Однако, если текст элемента длинный, он переносится на две строки. Это работает нормально, пока вы не прокрутите его и не увидите. По умолчанию все изображения в строке выровнены по высоте. Когда вы прокручиваете строку за кадром, а затем снова на экране, вы увидите, что строка каким-то образом выравнивается по нижнему краю. Это выглядит так:
Первый макет:
[image] [image] [image]
[text] [text] [text
wrap]
так что хотя третий элемент имеет 2 строки текста, вершины выравниваются, что идеально. Если я прокручу эту строку с экрана, а затем снова включится, она будет выглядеть так:
[image]
[image] [image] [text
[text] [text] wrap]
поэтому строка будет выровнена по нижнему краю. Я не уверен, что это ошибка в GridView, или если есть способ контролировать макет, чтобы всегда выравнивать строки. Я пробовал установить гравитацию макета элемента на "верх", ничего хорошего. Также нет никакой настройки, уникальной для GridView, для управления этим. Любые идеи?
Спасибо
Ответы
Ответ 1
Высота элементов в GridView должна быть одинаковой. У вас есть 2 или 3 варианта.
- Дайте высоту TextView
- Сделайте одиночную строку TextView с
android:singleLine="true"
- Если у вас должно быть 2 строки в некоторых элементах, сделайте все предметы двумя строками. Вы можете сделать это
android:minLines="2"
Ответ 2
Попробуйте android:layout_gravity="top"
в LinearLayout
.
Кроме того, если вы вручную раздуваете свои макеты для ячеек, обязательно используйте версию inflate()
, которая принимает GridView
как второй параметр и использует false для третьего параметра.
Ответ 3
Некоторые устройства не работают со стилем.
grid.setColumnWidth(90);
grid.setNumColumns(GridView.AUTO_FIT);
grid.setVerticalSpacing(10);
grid.setHorizontalSpacing(10);
grid.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
grid.setGravity(Gravity.CENTER);
grid.setOnItemClickListener(this);
<style name="GridViewStyle" parent="@android:style/Widget.GridView">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">fill_parent</item>
<item name="android:columnWidth">90dp</item>
<item name="android:numColumns">auto_fit</item>
<item name="android:verticalSpacing">10dp</item>
<item name="android:horizontalSpacing">10dp</item>
<item name="android:stretchMode">columnWidth</item>
<item name="android:gravity">center</item>
</style>
//посмотрим, как мой адаптер возвращает textview
// У меня проблемы со сменой, вам просто нужно обновить адаптер (onResume или изменение ориентации)
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView!=null) return convertView;
Intent intent = (Intent) getItem(position);
TextView tv = new TextView(mContext);
tv.setGravity(Gravity.CENTER_HORIZONTAL);
tv.setText(intent.getStringExtra("text"));
try {
tv.setCompoundDrawablesWithIntrinsicBounds(null, mContext.getPackageManager().getActivityIcon(intent), null, null);
} catch (NameNotFoundException e) {
tv.setCompoundDrawablesWithIntrinsicBounds(0, android.R.drawable.ic_secure, 0, 0);
}
return tv;
}
Ответ 4
Если вы используете метод getview, вы можете установить его высоту/ширину динамически, вам не нужно принимать все элементы одинакового размера. Он автоматически обрезает изображение из центра динамически.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView = new ImageView(mContext);
imageView.setImageResource(mThumbIds[position]);
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); //it will crop the image from center
imageView.setLayoutParams(new GridView.LayoutParams(70, 70));
return imageView;
}
Также укажите количество желаемых количеств в xml
<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/grid_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:numColumns="2" // set the number of coloums
android:columnWidth="90dp"
android:horizontalSpacing="10dp"
android:verticalSpacing="10dp"
android:gravity="center"
android:stretchMode="columnWidth" >
</GridView>