媛馨 發表於 2020-3-31 15:12:00

Android开发 GridView详解

<h1><span style="color: rgba(0, 128, 128, 1)">前言</span></h1>
<p>&nbsp;  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)">&lt;</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)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">GridView</span><span style="color: rgba(0, 0, 255, 1)">&gt;</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>&nbsp;</p>
<h1><span style="color: rgba(0, 128, 128, 1)">例子1 使用ArrayAdapter</span></h1>
<p>在Activity里</p>
<div class="cnblogs_code">
<pre>List&lt;String&gt; stringList = <span style="color: rgba(0, 0, 255, 1)">new ArrayList&lt;&gt;<span style="color: rgba(0, 0, 0, 1)">();
ArrayAdapter&lt;String&gt; arrayAdapter = <span style="color: rgba(0, 0, 255, 1)">new ArrayAdapter&lt;&gt;(<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>&nbsp;<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)">&lt;?<span style="color: rgba(255, 0, 255, 1)">xml version="1.0" encoding="utf-8"<span style="color: rgba(0, 0, 255, 1)">?&gt;
<span style="color: rgba(0, 0, 255, 1)">&lt;<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)">&gt;

<span style="color: rgba(0, 0, 255, 1)">&lt;/<span style="color: rgba(128, 0, 0, 1)">TextView<span style="color: rgba(0, 0, 255, 1)">&gt;</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>&nbsp;</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&lt;Map&lt;String, Object&gt;&gt;<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&lt;?&gt; 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&lt;Map&lt;String, Object&gt;&gt;<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 &lt;icno.length; i++<span style="color: rgba(0, 0, 0, 1)">) {
            Map&lt;String, Object&gt; map=<span style="color: rgba(0, 0, 255, 1)">new HashMap&lt;String, Object&gt;<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)">&lt;<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)">&gt;
    <span style="color: rgba(0, 0, 255, 1)">&lt;<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)">/&gt;
<span style="color: rgba(0, 0, 255, 1)">&lt;/<span style="color: rgba(128, 0, 0, 1)">LinearLayout<span style="color: rgba(0, 0, 255, 1)">&gt;</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)">&lt;<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)">&gt;

    <span style="color: rgba(0, 0, 255, 1)">&lt;<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)">/&gt;
    <span style="color: rgba(0, 0, 255, 1)">&lt;<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)">/&gt;

<span style="color: rgba(0, 0, 255, 1)">&lt;/<span style="color: rgba(128, 0, 0, 1)">LinearLayout<span style="color: rgba(0, 0, 255, 1)">&gt;</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 &gt;&gt; 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>&nbsp;</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]
查看完整版本: Android开发 GridView详解