1.首先,我们要创建一个类来保存我们要显示在ListView上面的数据。下面定义了一个含有一个名字和一个资源ID的类MainItem.java:
public class MainItem { private String name; private int imageId; public MainItem(String name, int imageId){ this.name = name; this.imageId = imageId; } public String getName(){ return name; } public int getImageId(){ return imageId; } }
2.自定义一个ArrayAdapter,去适配我们要在界面上显示的内容MainItemAdapter.java:
public class MainItemAdapter extends ArrayAdapter<MainItem> { private int resourceId;//记录下来稍后使用,见下面的构造函数 @Override public View getView(int position, View convertView, ViewGroup parent) {//显示一行时将会调用它 // 系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必须手动映射数据,这需要重写getView()方法。 // 系统在绘制列表的每一行的时候将调用此方法。position表示将显示的是第几行,covertView是从布局文件中inflate来的布局。parent是最终要显示的地方 // 我们用LayoutInflater的方法将定义好的image_item.xml文件提取成View实例用来显示。然后将xml文件中的各个组件实例化(简单的findViewById()方法)。 MainItem mainItem = getItem(position);//getItem是ArrayAdapter的方法,它根据position获取MainItem对象 View view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);//获取View ImageView mainItemImage = (ImageView) view.findViewById(R.id.item_image);//将组件实例化,必须实例化,因为它是以view去//findViewById的,所以它自动添加到了view上面
TextView mainItenName = (TextView) view.findViewById(R.id.item_name);//将组件实例化,必须实例化 mainItemImage.setImageResource(mainItem.getImageId());//设置组件内容 mainItenName.setText(mainItem.getName());//设置组件内容 return view;//返回视图View,这里它只是ListView的一行 } public MainItemAdapter(Context context, int resourceId, List<MainItem> objects) {//构造函数,顺便记录resourceId //context是前面传入的上下文Context,resourceId可以显示一行文字的一个布局文件的Id,所以这里需要记录它而放在getView()中使用,objects是数据源 super(context, resourceId, objects); this.resourceId = resourceId; } }}
3.在主文件中添加数据源并设置该适配器:
public class MainActivity extends AppCompatActivity { private List<MainItem> itemList = new ArrayList<MainItem>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initMainItem(); //初始化数据 MainItemAdapter adapter = new MainItemAdapter(MainActivity.this, R.layout.main_item, itemList);//Arrayadapter的三个参数, // 分别是上下文Context、可以显示一行文字的一个布局文件和数据源,分别传给MainItemAdapter的构造函数 GridView gridView = (GridView) findViewById(R.id.grid_view); gridView.setAdapter(adapter); gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { MainItem item = itemList.get(position); showNewActivity(item.getName()); } }); } private void initMainItem() { MainItem item_1 = new MainItem("记账本", R.drawable.account_book); itemList.add(item_1); MainItem item_2 = new MainItem("备忘录", R.drawable.memo_info); itemList.add(item_2); MainItem item_3 = new MainItem("计算器", R.drawable.calculator); itemList.add(item_3); MainItem item_4 = new MainItem("通讯录", R.drawable.phone_book); itemList.add(item_4); MainItem item_5 = new MainItem("天气", R.drawable.weather_info); itemList.add(item_5); MainItem item_6 = new MainItem("关于", R.drawable.help_info); itemList.add(item_6); }}