1、前言

迎来第二章的更新啦:使用ListView实现关卡的选择。

本章的内容有点小复杂,毕竟涉及使用了安卓开发中最难用也是最经常使用的控件之一:ListView

本章能够说是复杂可是单一吧。主要是想你们看完整个系列后收获的不只仅是照抄照搬代码,最后实现也只实现了一个简简单单的BoxGame。我更但愿你们看了以后,能吸取到一些属于本身的东西,最后能实现的是OtherGames ,至少本章能让你熟悉掌握ListView的使用。java

2、代码实现

一、ChoiceActivity的布局文件

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=".ChoiceActivity"

android:orientation="vertical">

android:id="@+id/lv_mapList"

android:layout_width="match_parent"

android:layout_height="match_parent">

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

二、使用ListView的准备工做

a、新建一个java.class文件(注意:不是新建一个Activity)

业务代码以下:web

/*

* 地图名称类

* */

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文件

布局代码以下app

android: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">

android:id="@+id/tv_mapName"

android:layout_width="match_parent"

android:layout_height="56dp"

android:textSize="25sp"

android:text="第一关"

android:gravity="center"/>

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

三、ListView适配器

新建一个java.class文件,使其继承ArrayAdapter类。

具体代码以下:svg

/*

* ListView的适配器

* */

public class ChoiceList_adapter extends ArrayAdapter {

private int resourceId; // List子项布局的ID

/*

* 此方法用于将上下文环境(参数1)、子项布局的ID(参数2)、子项布局的数据(参数3)传递进来

* */

public ChoiceList_adapter( Context context, int resource, List objects) {

super(context, resource, objects);

this.resourceId = resource;

}

@Override

public 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;

}

四、ChoiceActivity相关代码

/*

* 选择关卡界面

* */

public class ChoiceActivity extends AppCompatActivity {

// 声明ListView控件

ListView lv_mapList;

// 实例化一个地图选择的列表

private List choiceMapDataList = new ArrayList<>();

Intent intent_mapCode;

@Override

protected 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() {

@Override

public 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 {

@Override

protected 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();

}

}

3、总结

这章的内容很少,可是涉及了ListView的使用因此会比较的复杂,可是多练练就能够掌握了。毕竟这个控件仍是很经常使用的,因此花一章的篇幅来说它,是对它的尊重吧,哈哈。

总而言之,ListView主要有三个准备步骤:

一、新建数据的对象类

二、新建一个layout布局

三、新建ListView的适配器

好了,本章结束。下一章咱们讲如何画地图

下章见。

本章最终实现效果

优化

android实现推箱子代码,android开发--推箱子小游戏(二)相关推荐

  1. python接水果游戏代码_Python开发接水果小游戏编程

    我研发的Python游戏引擎Pylash已经更新到1.4了.现在我们就来使用它完成一个极其简单的小游戏:接水果.以下是游戏截图: vc/yvPy/2NbGyMvO79LGtq+jrMq5yMvO79P ...

  2. Android事件分发机制在实战开发中的应用之二

    学习的最终目标就是要学以致用,本文所分享的案例都是自己在公司实战开发过程中的真实案例,现在把它分享出来,希望对初学者有所帮助 版权声明:本文来自门心叼龙的博客,属于原创内容,转载请注明出处:https ...

  3. java代码实现打气球游戏_javascript+css3开发打气球小游戏完整代码

    效果知识点: css3画气球, 自定义属性运用,随机阵列, DOM元素操作,高级回调函数与参数复传,动态布局,鼠标事件,定时器运用,CSS3新增样式等. css代码如下: {margin:0;padd ...

  4. java代码实现打气球游戏_关于javascript和css3开发打气球小游戏的完整代码

    这篇文章主要介绍了关于javascript和css3开发打气球小游戏的完整代码,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下 这是一个简单但是印象深刻的小游戏,打气球小游戏的实现代码, ...

  5. 如何开发一个扫雷小游戏?

    如何用C#开发一个扫雷小游戏? 十分自豪的说,计算机编程就是变魔术,每一个coder都是一个魔术师. 初学C#的时候,我相信很多人都和我一样,学会了基本语法,掌握了基本的数据结构,也见过了不少微软提供 ...

  6. 游戏自审自查报告_开发的射箭小游戏上线了,分享一下我在开发过程中遇到的问题...

    利用业余时间开发的微信小游戏-射箭救人质上线了,主要玩法就是操作弓箭射断绳子把人救下来就可以了.图片资源是我找一个朋友做的.开发过程不算太顺利.磕磕绊绊做了12关.希望大家支持下.谢谢. 分享一下我在 ...

  7. C语言开发打气球小游戏

    C语言开发打气球小游戏 首先我们写一下项目所需要的头文件 #include<stdio.h>//标准输入输出头文件 #include<math.h>//数学库头文件 #incl ...

  8. 开发一个Canvas小游戏 实现一个游戏“引擎”

    前言 这个游戏其实在三四年前就写了,中间还重构过好几次,之前都是用简单的面向对象和函数式编程来写,游戏中的元素关系到还是分的挺开,但是游戏的渲染,运算等逻辑分的不够清晰,整个逻辑基本都是自顶向下的流水 ...

  9. 如何利用HTML5快速开发一款小游戏

    如何利用HTML5开发一款小游戏?Cocos2d-js是一款流行的H5游戏开发框架,介绍Cocos2d-js的核心技术和使用方法,学完以后可以独立开发一款休闲游戏,主要介绍cocos2d-js中的图层 ...

  10. 用Java开发贪食蛇小游戏

    用Java开发贪食蛇小游戏 一.实验内容 1.实现贪吃蛇游戏基本功能,屏幕上随机出现一个"食物",称为豆子,上下左右控制"蛇"的移动,吃到"豆子&qu ...

最新文章

  1. 国内外有哪些不错的需求管理工具?如何选择?
  2. idea创建、运行、打包控制台程序
  3. Django基本命令
  4. 转载 Socket与TCP/IP的关系 转(非常好的一篇文章!)
  5. (33)Verilog HDL缩减运算
  6. go 的时间与时间戳计算
  7. c# contains方法_C#/.Net Core/WPF框架初建(国际化、主题色)
  8. win 10 系统激活
  9. Linux内核编程《一》
  10. 学习笔记:云计算安全CCSK
  11. 软件工程师面试7大技巧
  12. CWE-476: NULL Pointer Dereference(空指针间接引用)
  13. eot文件html,html – 为什么IE8没有加载我的eot文件?
  14. 华三交换机升级的ipe文件_H3C 交换机升级说明
  15. python数字加密资产_GitHub - ezpod/crypto-exchange-engine: 数字加密资产交易引擎的原理性实现代码,汇智网提供...
  16. 如何高效的学习JAVA?
  17. 漂亮大气的html导航页面,非常大气漂亮的CSS导航栏
  18. CSS .class .class与.class.class区别
  19. 去信任外包虚荣地址生成
  20. 计算机系统大作业——程序人生P2P

热门文章

  1. CSS实现3D菜单效果【每日一题】
  2. IBM X3650 M4服务器数据恢复成功案例
  3. ASML大举向中国出口光刻机,或在于忧虑中国光刻机技术取得突破
  4. 牛牛的旅游纪念品(背包DP)
  5. 简单粗暴讲述自动化仓储系统
  6. Windows 自带计算器的使用
  7. 好听的女孩名字2225个 懿婕、馨媛、雨熙、若涵、馨瑜、瑾涵、羽欣、琪悦、逸菲、馨瑜、雨婷、昕妤、婉婷、梦琪、馨月、佳瑜、晓琦、婷瑛、诗琪、瑾瑜、艺琳、雨婷、欣怡、诗雨、佳琪、悦涵、昕瑶、蓓佳、诗萌、
  8. macOS Big Sur 11.7.1 (20G918) 正式版 ISO、PKG、DMG、IPSW 下载
  9. php codesniffer 代码规范,PHP_CodeSniffer自定义代码规范规则
  10. 低熵加壳malware