Android开发 GridView详解
<h1><span style="color: rgba(0, 128, 128, 1)">前言</span></h1><p> GridView 是Android开发用于横向排列 或者 宫格排列的 列表布局,在数据不多且Ui简单的情况下推荐使用这种布局,因为代码起来会比<span style="color: rgba(0, 0, 0, 1)">RecyclerView很少</span>。</p>
<h1><span style="color: rgba(0, 128, 128, 1)">xml样板</span></h1>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">GridView
</span><span style="color: rgba(255, 0, 0, 1)">android:id</span><span style="color: rgba(0, 0, 255, 1)">="@+id/gridview"</span><span style="color: rgba(255, 0, 0, 1)">
android:layout_width</span><span style="color: rgba(0, 0, 255, 1)">="match_parent"</span><span style="color: rgba(255, 0, 0, 1)">
android:layout_height</span><span style="color: rgba(0, 0, 255, 1)">="wrap_content"</span><span style="color: rgba(255, 0, 0, 1)">
android:gravity</span><span style="color: rgba(0, 0, 255, 1)">="center_horizontal"</span><span style="color: rgba(255, 0, 0, 1)">
android:horizontalSpacing</span><span style="color: rgba(0, 0, 255, 1)">="1dp"</span><span style="color: rgba(255, 0, 0, 1)">
android:numColumns</span><span style="color: rgba(0, 0, 255, 1)">="3"</span><span style="color: rgba(255, 0, 0, 1)">
android:verticalSpacing</span><span style="color: rgba(0, 0, 255, 1)">="1dp"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">GridView</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<h1><span style="color: rgba(0, 128, 128, 1)">常用的属性</span></h1>
<p>android:numColumns="auto_fit" ,GridView的列数设置为自动</p>
<p>android:columnWidth="90dp",每列的宽度,也就是Item的宽度</p>
<p>android:stretchMode="columnWidth",缩放与列宽大小同步</p>
<table>
<tbody>
<tr>
<td align="left">NO_STRETCH</td>
<td align="left">0</td>
<td align="left">扩展无效</td>
</tr>
<tr>
<td align="left">STRETCH_COLUMN_WIDTH</td>
<td align="left">2</td>
<td align="left">扩展列</td>
</tr>
<tr>
<td align="left">STRETCH_SPACING</td>
<td align="left">1</td>
<td align="left">扩展列间的空间</td>
</tr>
<tr>
<td align="left">STRETCH_SPACING_UNIFORM</td>
<td align="left">3</td>
<td align="left">均匀地扩展列间的空间</td>
</tr>
</tbody>
</table>
<p>android:verticalSpacing="10dp",两行之间的边距</p>
<p>android:horizontalSpacing="10dp",两列之间的边距</p>
<p> </p>
<h1><span style="color: rgba(0, 128, 128, 1)">例子1 使用ArrayAdapter</span></h1>
<p>在Activity里</p>
<div class="cnblogs_code">
<pre>List<String> stringList = <span style="color: rgba(0, 0, 255, 1)">new ArrayList<><span style="color: rgba(0, 0, 0, 1)">();
ArrayAdapter<String> arrayAdapter = <span style="color: rgba(0, 0, 255, 1)">new ArrayAdapter<>(<span style="color: rgba(0, 0, 255, 1)">this<span style="color: rgba(0, 0, 0, 1)">,R.layout.text_parent_select_item,stringList);
gridView.setAdapter(arrayAdapter);</span></span></span></span></span></pre>
</div>
<p> <span style="color: rgba(0, 0, 255, 1)"><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 0, 255, 1)"><span style="color: rgba(0, 0, 255, 1)"><span style="color: rgba(0, 0, 0, 1)">text_parent_select_item.xml</span></span></span></span></span></p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码"></span></div>
<pre><span style="color: rgba(0, 0, 255, 1)"><?<span style="color: rgba(255, 0, 255, 1)">xml version="1.0" encoding="utf-8"<span style="color: rgba(0, 0, 255, 1)">?>
<span style="color: rgba(0, 0, 255, 1)"><<span style="color: rgba(128, 0, 0, 1)">TextView <span style="color: rgba(255, 0, 0, 1)">xmlns:android<span style="color: rgba(0, 0, 255, 1)">="http://schemas.android.com/apk/res/android"<span style="color: rgba(255, 0, 0, 1)">
android:id<span style="color: rgba(0, 0, 255, 1)">="@+id/name"<span style="color: rgba(255, 0, 0, 1)">
android:layout_width<span style="color: rgba(0, 0, 255, 1)">="75dp"<span style="color: rgba(255, 0, 0, 1)">
android:layout_height<span style="color: rgba(0, 0, 255, 1)">="37dp"<span style="color: rgba(255, 0, 0, 1)">
android:textSize<span style="color: rgba(0, 0, 255, 1)">="@dimen/font_size_16"<span style="color: rgba(255, 0, 0, 1)">
android:textColor<span style="color: rgba(0, 0, 255, 1)">="@color/fontBlack1"<span style="color: rgba(255, 0, 0, 1)">
android:gravity<span style="color: rgba(0, 0, 255, 1)">="center"<span style="color: rgba(255, 0, 0, 1)">
android:maxLines<span style="color: rgba(0, 0, 255, 1)">="1"<span style="color: rgba(255, 0, 0, 1)">
android:background<span style="color: rgba(0, 0, 255, 1)">="@drawable/bg_orange_edge_rectangle"<span style="color: rgba(0, 0, 255, 1)">>
<span style="color: rgba(0, 0, 255, 1)"></<span style="color: rgba(128, 0, 0, 1)">TextView<span style="color: rgba(0, 0, 255, 1)">></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码"></span></div>
</div>
<p> </p>
<h1><span style="background-color: rgba(255, 255, 255, 1); color: rgba(0, 128, 128, 1)">例子2 使用SimpleAdapter</span></h1>
<p>Activity类</p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码"></span></div>
<pre><span style="color: rgba(0, 0, 255, 1)">public <span style="color: rgba(0, 0, 255, 1)">class MainActivity <span style="color: rgba(0, 0, 255, 1)">extends<span style="color: rgba(0, 0, 0, 1)"> Activity {
<span style="color: rgba(0, 0, 255, 1)">private<span style="color: rgba(0, 0, 0, 1)"> GridView gridView;
<span style="color: rgba(0, 0, 255, 1)">private List<Map<String, Object>><span style="color: rgba(0, 0, 0, 1)"> dataList;
<span style="color: rgba(0, 0, 255, 1)">private<span style="color: rgba(0, 0, 0, 1)"> SimpleAdapter adapter;
<span style="color: rgba(0, 128, 0, 1)">//<span style="color: rgba(0, 128, 0, 1)">如果只有TextView 可以考虑使用ArrayAdapter 适配器,当然你也可以自定义适配器
<span style="color: rgba(0, 0, 0, 1)">
@Override
<span style="color: rgba(0, 0, 255, 1)">protected <span style="color: rgba(0, 0, 255, 1)">void<span style="color: rgba(0, 0, 0, 1)"> onCreate(Bundle savedInstanceState) {
<span style="color: rgba(0, 0, 255, 1)">super<span style="color: rgba(0, 0, 0, 1)">.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gridView =<span style="color: rgba(0, 0, 0, 1)"> (GridView) findViewById(R.id.gridview);
<span style="color: rgba(0, 128, 0, 1)">//<span style="color: rgba(0, 128, 0, 1)">初始化数据
<span style="color: rgba(0, 0, 0, 1)"> initData();
String[] from={"img","text"<span style="color: rgba(0, 0, 0, 1)">};
<span style="color: rgba(0, 0, 255, 1)">int[] to=<span style="color: rgba(0, 0, 0, 1)">{R.id.img,R.id.text};
adapter=<span style="color: rgba(0, 0, 255, 1)">new SimpleAdapter(<span style="color: rgba(0, 0, 255, 1)">this<span style="color: rgba(0, 0, 0, 1)">, dataList, R.layout.gridview_item, from, to);
gridView.setAdapter(adapter);
gridView.setOnItemClickListener(<span style="color: rgba(0, 0, 255, 1)">new<span style="color: rgba(0, 0, 0, 1)"> OnItemClickListener() {
@Override
<span style="color: rgba(0, 0, 255, 1)">public <span style="color: rgba(0, 0, 255, 1)">void onItemClick(AdapterView<?> arg0, View arg1, <span style="color: rgba(0, 0, 255, 1)">int<span style="color: rgba(0, 0, 0, 1)"> arg2,
<span style="color: rgba(0, 0, 255, 1)">long<span style="color: rgba(0, 0, 0, 1)"> arg3) {
AlertDialog.Builder builder= <span style="color: rgba(0, 0, 255, 1)">new AlertDialog.Builder(MainActivity.<span style="color: rgba(0, 0, 255, 1)">this<span style="color: rgba(0, 0, 0, 1)">);
builder.setTitle("提示").setMessage(dataList.get(arg2).get("text"<span style="color: rgba(0, 0, 0, 1)">).toString()).create().show();
}
});
}
<span style="color: rgba(0, 0, 255, 1)">void<span style="color: rgba(0, 0, 0, 1)"> initData() {
<span style="color: rgba(0, 128, 0, 1)">//<span style="color: rgba(0, 128, 0, 1)">图标
<span style="color: rgba(0, 0, 255, 1)">int icno[] =<span style="color: rgba(0, 0, 0, 1)"> { R.drawable.i1, R.drawable.i2, R.drawable.i3,
R.drawable.i4, R.drawable.i5, R.drawable.i6, R.drawable.i7,
R.drawable.i8, R.drawable.i9, R.drawable.i10, R.drawable.i11, R.drawable.i12 };
<span style="color: rgba(0, 128, 0, 1)">//<span style="color: rgba(0, 128, 0, 1)">图标下的文字
String name[]={"时钟","信号","宝箱","秒钟","大象","FF","记事本","书签","印象","商店","主题","迅雷"<span style="color: rgba(0, 0, 0, 1)">};
dataList = <span style="color: rgba(0, 0, 255, 1)">new ArrayList<Map<String, Object>><span style="color: rgba(0, 0, 0, 1)">();
<span style="color: rgba(0, 0, 255, 1)">for (<span style="color: rgba(0, 0, 255, 1)">int i = 0; i <icno.length; i++<span style="color: rgba(0, 0, 0, 1)">) {
Map<String, Object> map=<span style="color: rgba(0, 0, 255, 1)">new HashMap<String, Object><span style="color: rgba(0, 0, 0, 1)">();
map.put("img"<span style="color: rgba(0, 0, 0, 1)">, icno);
map.put("text"<span style="color: rgba(0, 0, 0, 1)">,name);
dataList.add(map);
}
}
} </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码"></span></div>
</div>
<p><br>GridView主布局文件activity_main.xml</p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码"></span></div>
<pre><span style="color: rgba(0, 0, 255, 1)"><<span style="color: rgba(128, 0, 0, 1)">LinearLayout <span style="color: rgba(255, 0, 0, 1)">xmlns:android<span style="color: rgba(0, 0, 255, 1)">="http://schemas.android.com/apk/res/android"<span style="color: rgba(255, 0, 0, 1)">
xmlns:tools<span style="color: rgba(0, 0, 255, 1)">="http://schemas.android.com/tools"<span style="color: rgba(255, 0, 0, 1)">
android:layout_width<span style="color: rgba(0, 0, 255, 1)">="match_parent"<span style="color: rgba(255, 0, 0, 1)">
android:layout_height<span style="color: rgba(0, 0, 255, 1)">="match_parent"<span style="color: rgba(255, 0, 0, 1)">
android:background<span style="color: rgba(0, 0, 255, 1)">="#000"<span style="color: rgba(255, 0, 0, 1)">
tools:context<span style="color: rgba(0, 0, 255, 1)">="com.example.l7.MainActivity" <span style="color: rgba(0, 0, 255, 1)">>
<span style="color: rgba(0, 0, 255, 1)"><<span style="color: rgba(128, 0, 0, 1)">GridView
<span style="color: rgba(255, 0, 0, 1)">android:id<span style="color: rgba(0, 0, 255, 1)">="@+id/gridview"<span style="color: rgba(255, 0, 0, 1)">
android:layout_width<span style="color: rgba(0, 0, 255, 1)">="match_parent"<span style="color: rgba(255, 0, 0, 1)">
android:layout_height<span style="color: rgba(0, 0, 255, 1)">="wrap_content"<span style="color: rgba(255, 0, 0, 1)">
android:columnWidth<span style="color: rgba(0, 0, 255, 1)">="80dp"<span style="color: rgba(255, 0, 0, 1)">
android:stretchMode<span style="color: rgba(0, 0, 255, 1)">="spacingWidthUniform"<span style="color: rgba(255, 0, 0, 1)">
android:numColumns<span style="color: rgba(0, 0, 255, 1)">="3"
<span style="color: rgba(0, 0, 255, 1)">/>
<span style="color: rgba(0, 0, 255, 1)"></<span style="color: rgba(128, 0, 0, 1)">LinearLayout<span style="color: rgba(0, 0, 255, 1)">></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码"></span></div>
</div>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码"></span></div>
<pre><span style="color: rgba(0, 0, 0, 1)">列表项布局gridview_item.xml
<span style="color: rgba(0, 0, 255, 1)"><<span style="color: rgba(128, 0, 0, 1)">LinearLayout <span style="color: rgba(255, 0, 0, 1)">xmlns:android<span style="color: rgba(0, 0, 255, 1)">="http://schemas.android.com/apk/res/android"<span style="color: rgba(255, 0, 0, 1)">
xmlns:tools<span style="color: rgba(0, 0, 255, 1)">="http://schemas.android.com/tools"<span style="color: rgba(255, 0, 0, 1)">
android:layout_width<span style="color: rgba(0, 0, 255, 1)">="wrap_content"<span style="color: rgba(255, 0, 0, 1)">
android:layout_height<span style="color: rgba(0, 0, 255, 1)">="wrap_content"<span style="color: rgba(255, 0, 0, 1)">
android:layout_gravity<span style="color: rgba(0, 0, 255, 1)">="center"<span style="color: rgba(255, 0, 0, 1)">
android:orientation<span style="color: rgba(0, 0, 255, 1)">="vertical" <span style="color: rgba(0, 0, 255, 1)">>
<span style="color: rgba(0, 0, 255, 1)"><<span style="color: rgba(128, 0, 0, 1)">ImageView
<span style="color: rgba(255, 0, 0, 1)">android:id<span style="color: rgba(0, 0, 255, 1)">="@+id/img"<span style="color: rgba(255, 0, 0, 1)">
android:layout_width<span style="color: rgba(0, 0, 255, 1)">="60dp"<span style="color: rgba(255, 0, 0, 1)">
android:layout_height<span style="color: rgba(0, 0, 255, 1)">="60dp"<span style="color: rgba(255, 0, 0, 1)">
android:layout_marginTop<span style="color: rgba(0, 0, 255, 1)">="10dp"<span style="color: rgba(255, 0, 0, 1)">
android:src<span style="color: rgba(0, 0, 255, 1)">="@drawable/ic_launcher" <span style="color: rgba(0, 0, 255, 1)">/>
<span style="color: rgba(0, 0, 255, 1)"><<span style="color: rgba(128, 0, 0, 1)">TextView
<span style="color: rgba(255, 0, 0, 1)">android:id<span style="color: rgba(0, 0, 255, 1)">="@+id/text"<span style="color: rgba(255, 0, 0, 1)">
android:layout_width<span style="color: rgba(0, 0, 255, 1)">="wrap_content"<span style="color: rgba(255, 0, 0, 1)">
android:layout_height<span style="color: rgba(0, 0, 255, 1)">="wrap_content"<span style="color: rgba(255, 0, 0, 1)">
android:layout_marginTop<span style="color: rgba(0, 0, 255, 1)">="2dp"<span style="color: rgba(255, 0, 0, 1)">
android:layout_gravity<span style="color: rgba(0, 0, 255, 1)">="center"<span style="color: rgba(255, 0, 0, 1)">
android:textColor<span style="color: rgba(0, 0, 255, 1)">="#FFF"<span style="color: rgba(255, 0, 0, 1)">
android:text<span style="color: rgba(0, 0, 255, 1)">="文字"
<span style="color: rgba(0, 0, 255, 1)">/>
<span style="color: rgba(0, 0, 255, 1)"></<span style="color: rgba(128, 0, 0, 1)">LinearLayout<span style="color: rgba(0, 0, 255, 1)">></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码"></span></div>
</div>
<h1><span style="color: rgba(0, 128, 128, 1)">只显示一行的问题</span></h1>
<p>格外注意!如果你是滚动布局(ListView、<span class="tag"><span class="tag-name">ScrollView等等)包裹<span style="color: rgba(0, 0, 0, 1)">GridView,就出现不会自动换行的问题。这个时候需要你如下自定义view。</span></span></span></p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码"></span></div>
<pre> <span style="color: rgba(0, 0, 255, 1)">package<span style="color: rgba(0, 0, 0, 1)"> com.weijie.app_user.activity.order;
<span style="color: rgba(0, 0, 255, 1)">import<span style="color: rgba(0, 0, 0, 1)"> android.content.Context;
<span style="color: rgba(0, 0, 255, 1)">import<span style="color: rgba(0, 0, 0, 1)"> android.util.AttributeSet;
<span style="color: rgba(0, 0, 255, 1)">import<span style="color: rgba(0, 0, 0, 1)"> android.widget.GridView;
<span style="color: rgba(0, 0, 255, 1)">public <span style="color: rgba(0, 0, 255, 1)">class MyGridView <span style="color: rgba(0, 0, 255, 1)">extends<span style="color: rgba(0, 0, 0, 1)"> GridView {
<span style="color: rgba(0, 0, 255, 1)">public<span style="color: rgba(0, 0, 0, 1)"> MyGridView(Context context, AttributeSet attrs) {
<span style="color: rgba(0, 0, 255, 1)">super<span style="color: rgba(0, 0, 0, 1)">(context, attrs);
}
<span style="color: rgba(0, 0, 255, 1)">public<span style="color: rgba(0, 0, 0, 1)"> MyGridView(Context context) {
<span style="color: rgba(0, 0, 255, 1)">super<span style="color: rgba(0, 0, 0, 1)">(context);
}
<span style="color: rgba(0, 0, 255, 1)">public MyGridView(Context context, AttributeSet attrs, <span style="color: rgba(0, 0, 255, 1)">int<span style="color: rgba(0, 0, 0, 1)"> defStyle) {
<span style="color: rgba(0, 0, 255, 1)">super<span style="color: rgba(0, 0, 0, 1)">(context, attrs, defStyle);
}
@Override
<span style="color: rgba(0, 0, 255, 1)">public <span style="color: rgba(0, 0, 255, 1)">void onMeasure(<span style="color: rgba(0, 0, 255, 1)">int widthMeasureSpec, <span style="color: rgba(0, 0, 255, 1)">int<span style="color: rgba(0, 0, 0, 1)"> heightMeasureSpec) {
<span style="color: rgba(0, 0, 255, 1)">int expandSpec =<span style="color: rgba(0, 0, 0, 1)"> MeasureSpec.makeMeasureSpec(
Integer.MAX_VALUE >> 2<span style="color: rgba(0, 0, 0, 1)">, MeasureSpec.AT_MOST);
<span style="color: rgba(0, 0, 255, 1)">super<span style="color: rgba(0, 0, 0, 1)">.onMeasure(widthMeasureSpec, expandSpec);
}
}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><img src="https://common.cnblogs.com/images/copycode.gif" alt="复制代码"></span></div>
</div>
<p> </p>
</div>
<div id="MySignature" role="contentinfo">
<div style="text-align: center">
<p style="color:orange;font-size:16px;" >本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/12605374.html </p>
<div style="color:orange;font-size:16px;">本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。 </div>
</div><br><br>
来源:https://www.cnblogs.com/guanxinjing/p/12605374.html
頁:
[1]