一、前言

迎来第二章的更新啦:使用ListView实现关卡的选择。
本章的内容有点小复杂,毕竟涉及使用了安卓开发中最难用也是最常用的控件之一:ListView
本章可以说是复杂但是单一吧。主要是想大家看完整个系列后收获的不仅仅是照抄照搬代码,最后实现也只实现了一个简简单单的BoxGame。我更希望大家看了之后,能吸收到一些属于自己的东西,最后能实现的是OtherGames ,至少本章能让你熟悉掌握ListView的使用。

二、代码实现

1、ChoiceActivity的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns: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=".ChoiceActivity"android:orientation="vertical"><ListViewandroid:id="@+id/lv_mapList"android:layout_width="match_parent"android:layout_height="match_parent"></ListView></LinearLayout>

这次我们把Button控件去掉了,换成了一个ListView来实现相同的功能:选择关卡并根据点击的关卡带参数跳转到游戏界面。如果看到这里不是很理解可以回去看看第一章。android开发–推箱子小游戏(一)

2、使用ListView的准备工作

a、新建一个java.class文件(注意:不是新建一个Activity)
业务代码如下:

/*
* 地图名称类
* */
public class ChoiceMapData {String MapName;   // 地图名称(即第一关、第二关等)
//    构造函数public ChoiceMapData(String MapName){this.MapName = MapName;}public String getMapName() {return MapName;}public void setMapName(String mapName) {MapName = mapName;}
}

这一个类用通俗的话讲就是ListView数据对象。当我们要新加入第101关的时候,只需要在为ListView添加数据的方法中 new 一个 ChoiceMapData的对象,然后传入参数:“第101关” 即可。
当然传入的参数类型以及个数可以自己在构造方法里面设置。后期的升级改造中会讲到,持续关注哦~

b、新建一个layout文件
布局代码如下

<?xml version="1.0" encoding="utf-8"?>
<!-- 布局格式改为线性布局 -->
<LinearLayoutandroid:id="@+id/ly_listItem"xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent">
<TextViewandroid:id="@+id/tv_mapName"android:layout_width="match_parent"android:layout_height="56dp"android:textSize="25sp"android:text="第一关"android:gravity="center"/>
</LinearLayout>

这个布局的作用是将TextView放到ListView的条目上显示出来,因为TextView不可能独立于布局之外存在,当然,在放到ListView上的时候,适配器会将这个父布局去掉,留下控件。因为一个界面只能存在一个父布局

3、ListView适配器

新建一个java.class文件,使其继承ArrayAdapter类。
具体代码如下:

/*
* ListView的适配器
* */
public class ChoiceList_adapter extends ArrayAdapter<ChoiceMapData> {private int resourceId; // List子项布局的ID/** 此方法用于将上下文环境(参数1)、子项布局的ID(参数2)、子项布局的数据(参数3)传递进来* */public ChoiceList_adapter( Context context, int resource, List<ChoiceMapData> objects) {super(context, resource, objects);this.resourceId = resource;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View view;ViewHolder viewHolder;
//        获取当前项的ChoiceMapDate的实例ChoiceMapData choiceMapData = getItem(position);
//        convertView:用于保存之前加载好的布局(提高 ListView 的运行效率)if (convertView == null){view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);viewHolder = new ViewHolder();viewHolder.mapName = view.findViewById(R.id.tv_mapName);
//            setTag()方法:将ViewHolder内的控件实例缓存到view中view.setTag(viewHolder);}else {view = convertView;
//            getTag()方法:当convertView不为空的时候,把viewHolder重新取出viewHolder = (ViewHolder) view.getTag();}viewHolder.mapName.setText(choiceMapData.getMapName());return view;}
/*
*用于缓存控件的实例(提高 ListView 的运行效率)
* */class ViewHolder{TextView mapName;}

看完上面的代码如果觉得很复杂,看不懂的话,可以将上面代码的getView()替换掉,换成这个,实现的功能一样,只是效率问题而已。

// 无优化版的ListView的适配器的getVIew方法public view getView(int position, View convertView, ViewGroup parent){ChoiceMapData choiceMapData = getItem(position);view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);TextView mapName = findViewByID(R.id.tv_mapName);mapName.setText(choiceMapData.getMapName());return view;}

4、ChoiceActivity相关代码

/*
* 选择关卡界面
* */
public class ChoiceActivity extends AppCompatActivity {
//    声明ListView控件ListView lv_mapList;
//    实例化一个地图选择的列表private List<ChoiceMapData> choiceMapDataList = new ArrayList<>();Intent intent_mapCode;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_choice);
//        绑定控件lv_mapList = findViewById(R.id.lv_mapList);
//        自定义的方法,放入数据initChoiceMapDate();
//        参数1:上下问环境;参数2:显示数据的布局;参数3:传入的数据final ChoiceList_adapter choiceListAdapter = new ChoiceList_adapter(ChoiceActivity.this,R.layout.choicelist_item, choiceMapDataList);
//        设置适配器lv_mapList.setAdapter(choiceListAdapter);/** 当条目被点击时自动回调* */intent_mapCode = new Intent(this, GameActivity.class);lv_mapList.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//                点击条目后携带数据跳转intent_mapCode.putExtra("mapCode",position+1);startActivity(intent_mapCode);}});}/** 利用循环放入数据* */public void initChoiceMapDate(){for (int i=1; i<10; i++){ChoiceMapData choiceMapData = new ChoiceMapData("推箱子第" + i + "关");choiceMapDataList.add(choiceMapData);}}
}

ChoiceActivity的代码难度并不大,需要掌握的是Intent的带参跳转。
以下是GameActivity的代码(暂时代码),主要是接收ChoiceActivity传过来的参数,与上章改动不大,需要注意的是参数类型改了。

public class GameActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_game);getMapCode();}/** 接收ChoiceActivity传送过来的数据* */public void getMapCode(){
//        参数1:键值; 参数2:默认值,即没有数据传过来时的值int mapCode = getIntent().getIntExtra("mapCode",0);if(mapCode == 0){Toast.makeText(this, "mapCode为空", Toast.LENGTH_SHORT).show();return;}Toast.makeText(this, ""+mapCode, Toast.LENGTH_SHORT).show();}
}

三、总结

这章的内容不多,但是涉及了ListView的使用所以会比较的复杂,但是多练练就可以掌握了。毕竟这个控件还是很常用的,所以花一章的篇幅来讲它,是对它的尊重吧,哈哈。
总而言之,ListView主要有三个准备步骤:
1、新建数据的对象类
2、新建一个layout布局
3、新建ListView的适配器
好了,本章结束。下一章我们讲如何画地图
下章见。
本章最终实现效果

android开发--推箱子小游戏(二)相关推荐

  1. 基于Android的推箱子小游戏 源码

    完整工程已打包放在我的资源文件中  https://download.csdn.net/download/huangshuai147/11151692 package com.example.push ...

  2. PLC也能制作小游戏----Codesys编写推箱子小游戏

    1.序言 前文已介绍,Codesys编程软件拥有的各种编译方式,以及强大的可视化功能,完全可以实现类似的小游戏程序编写,让疲惫的工控人员在调机的空闲之余可以休闲下,本文编写另一个小游戏,也是十几年前的 ...

  3. Android Studio实现推箱子小游戏

    项目目录 一.项目概述 二.开发环境 三.详细设计 四.运行演示 五.项目总结 六.源码获取 一.项目概述 推箱子是一款非常受欢迎的益智游戏,游戏的玩法简单,但是需要玩家具备一定的逻辑思维能力和空间感 ...

  4. 移动平台开发项目(推箱子小游戏)

    项目目的:实现一个推箱子小游戏 项目架构:使用三个活动类 项目功能: 能在touch中的Action_down动作下,实现小人推着箱子走的效果,全部箱子到达旗帜为过关. 能使用底部Button键来前后 ...

  5. java实现二维数组推箱子小游戏

    推箱子小游戏 import java.util.Scanner;public class 推箱子 {public static void main(String[] args) {int x =3, ...

  6. 手把手教你使用Python实现推箱子小游戏(附完整源码)

    文章目录 项目介绍 项目规则 项目接口文档 项目实现过程 前置方法编写 move核心方法编写 项目收尾 项目完善 项目整体源码 项目缺陷分析 项目收获与反思 项目介绍 我们这个项目是一个基于Pytho ...

  7. 基于html5实现的推箱子小游戏

    一.游戏功能分析 1)功能需求分析 功能需求分析如图1-1所示. 小人推箱子:当箱子周围存在通道时,通过小人的左右移动实现推箱子功能. 炸毁墙面:小人当前所在位置的四周有墙面时,按下空格可以炸毁墙面 ...

  8. 控制台推箱子小游戏C语言

    自己开发的C语言控制台推箱子小游戏,基于二维数组实现,功能不多但是游戏整体较为完整,因为技术有限,所以代码暂未优化且整体显得较为臃肿,整体架构简单,代码全自主设计编写,仅作交流学习,还望大佬多多指点. ...

  9. c++ 小游戏_C/C++编程笔记:C语言写推箱子小游戏,大一学习C语言练手项目

    C语言,作为大多数人的第一门编程语言,重要性不言而喻,很多编程习惯,逻辑方式在此时就已经形成了.这个是我在大一学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游 ...

最新文章

  1. poj -- 2288 Islands and Bridges
  2. 怎么确保一个集合不能被修改
  3. powershell 遍历json_如何从Powershell脚本读取JSON数据并遍历它
  4. Spring Boot————BeanCreationNotAllowedException异常分析
  5. Docker快速搭建Oracle12c
  6. 51单片机数码管小数点c语言,求助一个51单片机控制的数码管计算器带小数点功能的...
  7. python批量读取图片并复制入word_提取word文档中的图片并使用Python进行批量格式转换,出,Word,里,利用,python...
  8. $(document).ready(function(){}),$().ready(function(){})和$(function(){})三个有区别么
  9. 第三章 选择结构
  10. 计算机组成原理学习-哈工大《计算机组成原理》第二章
  11. Android使用本地广播
  12. 普元EOS7.5生成入参为数组的WebService接口
  13. 2022-2028年中国位置大数据行业市场专项调查及投资前景分析报告
  14. HDU 6319 Ascending Rating(单调队列)
  15. 数据库表同义词mysql修改_SQLServer中同义词Synonym的用法
  16. BizTalk Server : 提高 BizTalk 编程能力的 8 点技巧和窍门
  17. 【NLP】NLP基础知识
  18. 超强大的数学计算器——WolframAlpha(含安卓下载连接)
  19. 【Kaggle-House Price Prediction】代码参考
  20. 优先队列之加油站最小加油次数

热门文章

  1. Struts2 异常处理机制
  2. 随笔杂谈之EAN-13条形码
  3. python应用在人工智能_python应用篇-大数据和人工智能时代下,python牛在哪?
  4. 第十周总结——拆装机
  5. 向量概念,零向量,向量取反,计算向量的长度,单位向量
  6. linux设置网络自动连接网络设置密码,设置Linux网络开机自动连接
  7. make all和make有什么不同?
  8. 关于WIN10更新后没声音,音频变红X
  9. 利用OBS定时录制功能下载任何视频
  10. cocos creator 飞翔的小鸟