编程题笔记

基于适配器实现图文并茂的列表

activity_main.xml,定义与适配器绑定的列表的布局

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    
    <!-- 与适配器绑定的列表组件 -->
    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

item.xml,定义列表中每一项的布局

 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
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        tools:ignore="MissingConstraints">
        <!-- 显示图片的组件 -->
        <ImageView
            android:id="@+id/image"
            android:layout_width="72sp"
            android:layout_height="72sp"
            android:contentDescription="@string/imageview" />
        <!-- 显示文字的组件 -->
        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="36sp" />
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

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
36
37
public class MainActivity extends AppCompatActivity {
    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);
    }
}

活动跳转间传递数据

跳转流程

  1. 启动主活动,在主活动中输入编号,然后用户单击按钮跳转到次活动并将编号数据传递过去
  2. 次活动启动后调用业务逻辑获取与编号对应的姓名并将其显示在界面上,然后用户单击按钮跳转回主活动并将编号和姓名数据传递回去
  3. 主活动将得到的编号和姓名数据显示在界面上

具体实现

AndroidManifest.xml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<application>
    <!-- 在系统中注册主活动,应用启动时进入该活动 -->
    <activity
        android:name=".MainActivity"
        android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <!-- 在系统中注册次活动,否则活动跳转的代码无法工作,毕竟你都找不到那怎么访问 -->
    <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
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <!-- 主活动的文本显示组件 -->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="主活动"
        android:textSize="50sp" />

    <!-- 输入用户 ID 的文本编辑组件 -->
    <EditText
        android:id="@+id/inputID"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="50sp" />

    <!-- 展示从次活动返回的用户名的文本显示组件 -->
    <TextView
        android:id="@+id/viewNameInMain"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="50sp" />

    <!-- 通过调用 jumpForward 方法从主活动跳转到次活动的按钮组件 -->
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="jumpForward"
        android:text="获取姓名"
        android:textSize="50sp" />
</LinearLayout>

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
public class MainActivity extends AppCompatActivity {
    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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MinorActivity">

    <!-- 次活动的文本显示组件 -->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="次活动"
        android:textSize="50sp" />

    <!-- 展示来自主活动的用户 ID 的文本显示组件 -->
    <TextView
        android:id="@+id/viewIDInMinor"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="50sp" />

    <!-- 展示查询到的用户名的文本显示组件 -->
    <TextView
        android:id="@+id/viewNameInMinor"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="50sp" />

    <!-- 通过调用 jumpBackward 方法从次活动跳转到主活动的按钮组件 -->
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="jumpBackward"
        android:text="返回主活动"
        android:textSize="50sp" />
</LinearLayout>

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
36
37
public class MinorActivity extends AppCompatActivity {
    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);
    }
}
0%