前言
在完全理解的前提下,代码中的注释可以去除
xml 布局文件中的组件的 android:layout_width(宽度)属性和 android:layout_height(高度)属性统一赋值 " wrap_content",只有 LinearLayout 组件的这两个属性赋值 “match_parent”,本文档中该属性被省略但实际开发(或考试 :D)中所有组件都要写上两个属性
TextView 和 EditText 这类组件的 android:textSize(字号)属性写 36sp 即可,下文中也会被省略
基于适配器实现图文并茂的列表
activity_main.xml
1
2
3
| <!-- 与适配器绑定的列表组件 -->
<ListView
android:id="@+id/listView" />
|
item.xml
1
2
3
4
5
6
| <!-- 显示图片的组件 -->
<ImageView
android:id="@+id/image" />
<!-- 显示文字的组件 -->
<TextView
android:id="@+id/textView" />
|
MainActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| ListView listView;
ListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 中文内容数组,每个元素对应列表中的每一项的文字内容
String[] names = new String[]{"AAA", "BBB", "CCC", "DDD", "EEE", "FFF", "GGG", "HHH"};
// id 数组,每个 id 与本地图片资源一一对应,例如 R.drawable.a 对应 res/drawable/a.png
int[] images = new int[]{R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e, R.drawable.f, R.drawable.g, R.drawable.h};
// 创建并准备初始化以 Map 对象为元素的 List 对象,这是调用 SimpleAdapter 类构造器所需的实参
List<Map<String, Object>> list = new ArrayList<>();
for (int i = 0; i < names.length; i++) {
// 创建一个 Map,循环中的每个 Map 对象都含有两个元素,一个表示列表中某一项的图片内容,一个表示列表中某一项的文字内容
Map<String, Object> map = new HashMap<>();
map.put("image", images[i]);
map.put("description", names[i]);
list.add(map);
}
// 通过 id 绑定 listView 组件到 listView 变量
listView = findViewById(R.id.listView);
/*
* 调用 SimpleAdapter 类的构造器
* 第一个参数 MainActivity.this 表示被适配的对象
* 第二个参数 list 给列表提供数据
* 第三个参数 R.layout.item 将适配器对象与 layout/item.xml 布局绑定
* 第四个参数 new String[]{"image", "description"} 告诉适配器如何从第二个参数 list 中获取数据,适配器访问 list 中的 Map 类型的元素,然后用数组(第四个参数)中的字符串元素作为 key 从每一个 map 中获取 value
* 第五个参数 new int[]{R.id.image, R.id.textView} 告诉适配器在用第二个参数和第四个参数配合下取出数据后绑定到哪些组件
* */
adapter = new SimpleAdapter(MainActivity.this, list, R.layout.item, new String[]{"image", "description"}, new int[]{R.id.image, R.id.textView});
// 将 listView 组件与适配器绑定
listView.setAdapter(adapter);
}
|
活动跳转间传递数据
AndroidManifest.xml
1
2
3
4
| <application>
<!-- 在系统中注册次活动,否则活动跳转的代码无法工作,毕竟你都找不到那怎么访问 -->
<activity android:name=".MinorActivity" />
</application>
|
activity_main.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| <!-- 主活动的文本显示组件 -->
<TextView
android:text="主活动"
android:textSize="50sp" />
<!-- 输入用户 ID 的文本编辑组件 -->
<EditText
android:id="@+id/inputID" />
<!-- 展示从次活动返回的用户名的文本显示组件 -->
<TextView
android:id="@+id/viewNameInMain" />
<!-- 通过调用 jumpForward 方法从主活动跳转到次活动的按钮组件 -->
<Button
android:onClick="jumpForward"
android:text="获取姓名" />
|
MainActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
| EditText id;
TextView name;
// 活动启动时调用该方法,在其中给组件赋值
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 将 inputID 组件与 id 变量绑定
id = findViewById(R.id.inputID);
// 将 viewNameInMain 组件与 name 变量绑定
name = findViewById(R.id.viewNameInMain);
// 通过 id 变量设置 inputID 组件的值为从次活动传递回来的值
id.setText(getIntent().getStringExtra("id"));
// 通过 name 变量设置 viewNameInMain 组件的值为从次活动传递回来的值
name.setText(getIntent().getStringExtra("name"));
}
// 单击布局里的按钮触发该方法,创建并启动跳转
public void jumpForward(View v) {
// 创建从主活动到次活动的跳转(参数顺序决定跳转方向)
Intent intent = new Intent(MainActivity.this, MinorActivity.class);
// 在跳转中携带数据,数据的 key 为 id,从跳转中获取数据需要输入 key 来获取对应的 value
intent.putExtra("id", id.getText().toString());
// 启动跳转
startActivity(intent);
}
|
activity_minor.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| <!-- 次活动的文本显示组件 -->
<TextView
android:text="次活动" />
<!-- 展示来自主活动的用户 ID 的文本显示组件 -->
<TextView
android:id="@+id/viewIDInMinor" />
<!-- 展示查询到的用户名的文本显示组件 -->
<TextView
android:id="@+id/viewNameInMinor" />
<!-- 通过调用 jumpBackward 方法从次活动跳转到主活动的按钮组件 -->
<Button
android:onClick="jumpBackward"
android:text="返回主活动" />
|
MinorActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| TextView id;
TextView name;
Map<Integer, String> idNameMap = new HashMap<>();
{
// 存入数据,3 是编号,"YangHgRi" 是姓名,请修改为用户自己的编号和姓名
idNameMap.put(3, "YangHgRi");
}
// 活动启动时调用该方法,在其中给组件赋值
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_minor);
// 将 viewIDInMinor 组件与 id 变量绑定
id = findViewById(R.id.viewIDInMinor);
// 将 viewNameInMinor 组件与 name 变量绑定
name = findViewById(R.id.viewNameInMinor);
// 通过 id 变量设置 viewIDInMinor 组件的值为从主活动传递过来的值
id.setText(getIntent().getStringExtra("id"));
// 通过 name 变量设置 viewNameInMinor 组件的值为在 idNameMap 里存放的值
name.setText(idNameMap.get(Integer.valueOf(id.getText().toString())));
}
// 单击布局里的按钮触发该方法,创建并启动跳转
public void jumpBackward(View v) {
// 创建从次活动到主活动的跳转(参数顺序决定跳转方向)
Intent intent = new Intent(MinorActivity.this, MainActivity.class);
// 在跳转中携带数据,数据来自文本组件,也就是用户在应用界面上输入的数据
intent.putExtra("id", id.getText().toString());
intent.putExtra("name", name.getText().toString());
// 启动跳转
startActivity(intent);
}
|