我的 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
包含水平 LinearLayout
和 TextView
单元格,就像你有.诀窍是我捕获一行的水平滚动事件,然后将它们传播到所有行,因此所有行都会同步水平滚动,从而产生 two-way 滚动的效果。当然,由于每一行的回收,(垂直)滚动性能非常好。如果你有兴趣看到那个,请告诉我。
我不知道我的 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
包含水平 LinearLayout
和 TextView
单元格,就像你有.诀窍是我捕获一行的水平滚动事件,然后将它们传播到所有行,因此所有行都会同步水平滚动,从而产生 two-way 滚动的效果。当然,由于每一行的回收,(垂直)滚动性能非常好。如果你有兴趣看到那个,请告诉我。