效果

要点

会用GridView(和ListView差不多,可以分列排)
以及SimpleAdapter
有五个参数,在代码中会解释

思路

定义一个map型列表,存储所有图片,然后将其放到simpleAdapter适配器中
接着定义一个GridView设置这个适配器
再设置监听事件,当点击到某个子项时在下方显示

三个文件

MainActivity.java
activity_main.xml 设置GridView用于显示所有图片和ImageView用于显示选择的图片
image.xml 设置子项的布局,这里只用ImageView空间

代码

MainActivity

package com.example.a18307.crazyandroid

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import android.widget.AdapterView
import android.widget.GridView
import android.widget.ImageView
import android.widget.SimpleAdapter

class MainActivity : AppCompatActivity() {
//    定义图片数组,图片不能是纯数字
    internal var images= intArrayOf(R.drawable.p1,R.drawable.p2,R.drawable.p3,R.drawable.p4,
    R.drawable.p5,R.drawable.p6,R.drawable.p7,R.drawable.p8)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        var listItems=ArrayList<Map<String,Any>>()
        for(i in images.indices){
            var listItem=HashMap<String,Any>()
            listItem["image"]=images[i]
            listItems.add(listItem)
        }

        var imageView:ImageView=findViewById(R.id.imageView)
        //this表示当前环境,listItems是传入的map列表,R.layout.image是每一个子项的布局
        //arrayOf("image")是每个子项的键名(在上面的循环中都统一成了image,这里要和map中的key保持一致)
        //intArrayOf(R.id.image1)表示图片放置的控件id,这里都统一成一个
        var simpleAdapter =SimpleAdapter(this,listItems,R.layout.image,arrayOf("image"),intArrayOf(R.id.image1))
        var gridView:GridView=findViewById(R.id.grid01)
        gridView.adapter=simpleAdapter

        gridView.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{
            //?表示可以为空,避免空指针异常
            //在这个例子中,这个函数其实没有作用,但是他可以实现比如修改选中图片的颜色等功能
            override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
                TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
                imageView.setImageResource(images[position])
            }
            //注意中该函数里面不需要写东西,把原来的删掉
            override fun onNothingSelected(p0: AdapterView<*>?) {
            }
        }
        //监听到选中的图片,并放到下方
        gridView.onItemClickListener=AdapterView.OnItemClickListener{parent,view,position,id->
            imageView.setImageResource(images[position])

        }
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
    tools:context=".MainActivity">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    <GridView
        android:id="@+id/grid01"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:numColumns="4">

    </GridView>
    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"/>
    </LinearLayout>
</android.support.constraint.ConstraintLayout>

image.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/image">
    <android.support.v7.widget.AppCompatImageView
        android:id="@+id/image1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
</android.support.constraint.ConstraintLayout>