我的Android GridView出了什么问题?

时间:2015-12-29 15:56:08

标签: android android-adapter 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);

这就是它的样子:

enter image description here

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

enter image description here

我希望它看起来像这样:

enter image description here

我使用ScrollView和TableLayout完成了这个最终的,有吸引力的布局,但它确实非常糟糕且非常缓慢,所以我更愿意坚持使用GridView适配器。

1 个答案:

答案 0 :(得分:1)

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

当每个单元格(通常)是相同类型时,使用

GridView。如果你有一堆缩略图,那么无论是有两列还是四列,网格都会有意义。

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

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

然后你会想要开始玩行布局。一个好的开始是给你的TextView“单元格”赋予所有相同的权重以及minWidth值。

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

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