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

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, для управления этим. Любые идеи?

Спасибо

4b9b3361

Ответ 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>