我的 Android GridView 做错了什么?

What am I doing wrong with my Android GridView?

我不知道我的 Android GridView 做错了什么。我正在从 SQLite 数据库中提取数据,并将游标返回给适配器,但它在呈现时肯定没有正确排列。这是我的。

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:fitsSystemWindows="true"
    tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout android:layout_height="wrap_content"
        android:layout_width="match_parent" android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar android:id="@+id/toolbar"
            android:layout_width="match_parent" android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main" />

</android.support.design.widget.CoordinatorLayout>

content_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context=".MainActivity"
    tools:showIn="@layout/activity_main">

    <LinearLayout
        android:id="@+id/top_linear_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:orientation="horizontal">

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="8dp"
                android:src="@drawable/icon2" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:gravity="bottom"
                android:padding="8dp"
                android:text="@string/app_name"
                android:textColor="@color/app_name"
                android:textSize="38sp"
                android:textStyle="bold" />
        </LinearLayout>

        <include layout="@layout/top_right_info_board" />

    </LinearLayout>

    <GridView
        android:id="@+id/row_of_stats"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </GridView>

</RelativeLayout>

data_row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView
        android:id="@+id/id_textview"
        android:background="@color/RED"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent" />

    <TextView
        android:id="@+id/data01_textview"
        android:background="@color/DARKVIOLET"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent" />

    <TextView
        android:id="@+id/data02_textview"
        android:background="@color/YELLOWGREEN"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent" />

    <TextView
        android:id="@+id/data03_textview"
        android:background="@color/LIGHTPINK"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent" />

    <TextView
        android:id="@+id/data04_textview"
        android:background="@color/MIDNIGHTBLUE"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent" />

    <TextView
        android:id="@+id/data05_textview"
        android:background="@color/PALEVIOLETRED"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent" />

    <TextView
        android:id="@+id/data06_textview"
        android:background="@color/AQUA"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent" />

    <TextView
        android:id="@+id/data07_textview"
        android:background="@color/YELLOWGREEN"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent" />

    <TextView
        android:id="@+id/data08_textview"
        android:background="@color/BLUEVIOLET"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent" />

</LinearLayout>

MainActivity.java

dataCursor = myDBHelper.getDataCursor();
String[] fromColumns = {"_id","data01","data02","data03","data04","data05","data06","data07","data08"};
int[] toViews = {R.id.id_textview, R.id.data01_textview, R.id.data02_textview, R.id.data03_textview, R.id.data04_textview, R.id.data05_textview, R.id.data06_textview, R.id.data07_textview, R.id.data08_textview};
SimpleCursorAdapter mySimpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.data_row, dataCursor, fromColumns, toViews, 0);
GridView myGridView = (GridView) findViewById(R.id.row_of_stats);
myGridView.setAdapter(mySimpleCursorAdapter);

这是它的样子:

我尝试使用 android:numColumns="9",但这是之后发生的事情:

我希望它看起来像这样:

我使用 ScrollView 和 TableLayout 完成了这个最终的、有吸引力的布局,但它真的很笨拙而且 非常 慢,所以我宁愿坚持使用 GridView 适配器。

这是一个数据table;你不想要 GridView

GridView 当每个单元格(通常)是同一类型时使用。如果您有一堆缩略图,那么无论是两列还是四列,网格都有意义。

在您的情况下,每列代表的内容与其旁边的列不同,因此 GridView 在这里没有意义。

您可以先将 GridView 更改为 ListView。您的数据行布局已经处于水平方向,您有一个 CursorAdapter 做正确的事情。只需将 GridView 更改为 ListView 即可让您朝着正确的方向前进。

那么您将要开始使用行布局。一个好的开始是为您的 TextView "cells" 赋予相同的权重以及 minWidth 值。

您将遇到的最后一个问题是,当 table 比设备屏幕宽时,即使您已将行压缩到它的最小可读宽度之后,该怎么办。 super-simple 解决方案是使用 left/right 按钮。当用户按下按钮向右移动时,您将适配器设置为将 visibility="gone" 放在布局中的第一个 TextView 上,这使得 table 跳到左侧。如果用户再次按下右,则将前 两个 TextView 设置为 visibility="gone"。你明白了。

我正在为数据 table 开发一个项目,其中每个列表项视图都是一个 HorizontalScrollView 包含水平 LinearLayoutTextView 单元格,就像你有.诀窍是我捕获一行的水平滚动事件,然后将它们传播到所有行,因此所有行都会同步水平滚动,从而产生 two-way 滚动的效果。当然,由于每一行的回收,(垂直)滚动性能非常好。如果你有兴趣看到那个,请告诉我。