• 学习Android的第十九天


    目录

    Android ExpandableListView 分组列表

    ExpandableListView 属性

    ExpandableListView 事件

    ExpandableListView 的 Adapter

    范例

    参考文档

    Android ViewFlipper 翻转视图

    ViewFlipper 属性

    ViewFlipper 方法

    为 ViewFlipper 加入 View

    例子:全屏幕可以滑动的引导页

    参考文档


    Android ExpandableListView 分组列表

    Android 的 ExpandableListView(分组列表)是一个可以展开和收起的列表控件,通常用于显示具有层次结构的数据,类似于微信通讯录中的分组列表。

    在 ExpandableListView 中,第一层是分组(Group),第二层是每个分组下的子项(Child)。用户可以点击分组来展开或收起相应的子项。这种设计能够更好地组织和展示有层次结构的数据,提供更好的用户体验。

    ExpandableListView 属性

    • android:childDivider:指定各组内子列表项之间的分隔条。默认情况下是一条直线,你可以设置该属性来改变分隔条的样式。
    • android:childIndicator:指定显示在子列表旁边的 Drawable 对象,可以是一个图像。这个指示器可以帮助用户识别哪些分组可以展开或收起。
    • android:childIndicatorEnd、android:childIndicatorLeft、android:childIndicatorRight、android:childIndicatorStart:这些属性用于指定子列表项指示符(child indicator)的位置和约束。你可以使用这些属性来调整子列表项指示符的位置。
    • android:groupIndicator:指定显示在组列表旁边的 Drawable 对象,可以是一个图像。这个指示器可以帮助用户识别组的位置和状态。
    • android:indicatorEnd、android:indicatorLeft、android:indicatorRight、android:indicatorStart:这些属性用于指定组列表项指示器(group indicator)的位置和约束。你可以使用这些属性来调整组列表项指示器的位置。

    ExpandableListView 事件

    • OnChildClickListener:当用户点击分组列表的子项时触发。可以使用这个事件来处理子项被点击后的逻辑,例如显示详细信息或执行其他操作。
    • OnGroupClickListener:当用户点击分组列表的分组项时触发。可以使用这个事件来处理分组项被点击后的逻辑,例如展开或收起分组,或执行其他操作。
    • OnGroupCollapseListener:当分组列表的分组折叠时触发。可以使用这个事件来处理分组折叠后的逻辑,例如更新 UI 或执行其他操作。
    • OnGroupExpandListener:当分组列表的分组展开时触发。可以使用这个事件来处理分组展开后的逻辑,例如加载数据或执行其他操作。

    ExpandableListView 的 Adapter

    对于 ExpandableListView 的适配器(Adapter),有三种常见的实现方式:

    • 继承 BaseExpandableListAdapter 实现 ExpandableAdapter: 这是一种自定义适配器的方式,你需要创建一个类继承自 BaseExpandableListAdapter,并实现其中的方法,包括获取组数、获取指定组中的子项数、获取指定位置处的子项、获取指定位置处的组等。这种方式适用于自定义需求较复杂的情况,可以完全控制适配器的行为和样式。
    • 使用 SimpleExpandableListAdapter 将两个 List 集合包装成 ExpandableAdapter: SimpleExpandableListAdapter 是一个简单的适配器类,用于将两个 List 集合(一个用于存储组数据,另一个用于存储子项数据)包装成 ExpandableListView 所需的适配器。这种方式适用于数据比较简单的情况,不需要自定义适配器,只需要将数据进行简单的包装即可。
    • 使用 SimpleCursorTreeAdapter 将 Cursor 中的数据包装成 SimpleCursorTreeAdapter: SimpleCursorTreeAdapter 是专门用于将 Cursor 中的数据包装成 ExpandableListView 所需的适配器。如果你的数据存储在数据库中,并使用 Cursor 进行查询,那么你可以使用 SimpleCursorTreeAdapter 来将 Cursor 中的数据以树形结构展示在 ExpandableListView 中。

    范例

    1、修改 activity_main.xml

    1. "1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5. android:orientation="vertical"
    6. android:gravity="center">
    7. <ExpandableListView
    8. android:id="@+id/expandableListView"
    9. android:layout_width="match_parent"
    10. android:layout_height="match_parent" />
    11. LinearLayout>

    2、修改 MainActivity.java

    1. package com.example.myapplication;
    2. import android.os.Bundle;
    3. import android.widget.ExpandableListView;
    4. import android.widget.Toast;
    5. import androidx.appcompat.app.AppCompatActivity;
    6. import java.util.ArrayList;
    7. import java.util.HashMap;
    8. import java.util.List;
    9. public class MainActivity extends AppCompatActivity {
    10. ExpandableListView expandableListView;
    11. List listGroup;
    12. HashMap> listItem;
    13. @Override
    14. protected void onCreate(Bundle savedInstanceState) {
    15. super.onCreate(savedInstanceState);
    16. setContentView(R.layout.activity_main);
    17. expandableListView = findViewById(R.id.expandableListView);
    18. // 准备数据
    19. prepareListData();
    20. // 创建并设置适配器
    21. MyAdapter adapter = new MyAdapter(this, listGroup, listItem);
    22. expandableListView.setAdapter(adapter);
    23. // 设置分组项点击监听器
    24. expandableListView.setOnGroupClickListener((parent, v, groupPosition, id) -> {
    25. Toast.makeText(MainActivity.this,
    26. "Group Clicked " + listGroup.get(groupPosition),
    27. Toast.LENGTH_SHORT).show();
    28. return false;
    29. });
    30. // 设置子项点击监听器
    31. expandableListView.setOnChildClickListener((parent, v, groupPosition, childPosition, id) -> {
    32. Toast.makeText(MainActivity.this,
    33. "单击的子项 " + listItem.get(listGroup.get(groupPosition)).get(childPosition),
    34. Toast.LENGTH_SHORT).show();
    35. return false;
    36. });
    37. }
    38. // 准备数据
    39. private void prepareListData() {
    40. listGroup = new ArrayList<>();
    41. listItem = new HashMap<>();
    42. listGroup.add("水果");
    43. listGroup.add("蔬菜");
    44. listGroup.add("动物");
    45. List fruits = new ArrayList<>();
    46. fruits.add("苹果");
    47. fruits.add("香蕉");
    48. fruits.add("芒果");
    49. List vegetables = new ArrayList<>();
    50. vegetables.add("胡萝卜");
    51. vegetables.add("菠菜");
    52. vegetables.add("番茄");
    53. List animals = new ArrayList<>();
    54. animals.add("狗");
    55. animals.add("猫");
    56. animals.add("大象");
    57. listItem.put(listGroup.get(0), fruits);
    58. listItem.put(listGroup.get(1), vegetables);
    59. listItem.put(listGroup.get(2), animals);
    60. }
    61. }

    3、创建适配器类 MyAdapter.java

    1. package com.example.myapplication;
    2. import android.content.Context;
    3. import android.view.LayoutInflater;
    4. import android.view.View;
    5. import android.view.ViewGroup;
    6. import android.widget.BaseExpandableListAdapter;
    7. import android.widget.TextView;
    8. import java.util.HashMap;
    9. import java.util.List;
    10. public class MyAdapter extends BaseExpandableListAdapter {
    11. private Context context;
    12. private List listGroup;
    13. private HashMap> listItem;
    14. public MyAdapter(Context context, List listGroup, HashMap> listItem) {
    15. this.context = context;
    16. this.listGroup = listGroup;
    17. this.listItem = listItem;
    18. }
    19. @Override
    20. public int getGroupCount() {
    21. return listGroup.size();
    22. }
    23. @Override
    24. public int getChildrenCount(int groupPosition) {
    25. return listItem.get(listGroup.get(groupPosition)).size();
    26. }
    27. @Override
    28. public Object getGroup(int groupPosition) {
    29. return listGroup.get(groupPosition);
    30. }
    31. @Override
    32. public Object getChild(int groupPosition, int childPosition) {
    33. return listItem.get(listGroup.get(groupPosition)).get(childPosition);
    34. }
    35. @Override
    36. public long getGroupId(int groupPosition) {
    37. return groupPosition;
    38. }
    39. @Override
    40. public long getChildId(int groupPosition, int childPosition) {
    41. return childPosition;
    42. }
    43. @Override
    44. public boolean hasStableIds() {
    45. return false;
    46. }
    47. @Override
    48. public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
    49. String groupTitle = (String) getGroup(groupPosition);
    50. if (convertView == null) {
    51. LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    52. convertView = inflater.inflate(R.layout.list_group, null);
    53. }
    54. TextView textView = convertView.findViewById(R.id.listTitle);
    55. textView.setText(groupTitle);
    56. return convertView;
    57. }
    58. @Override
    59. public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
    60. String childTitle = (String) getChild(groupPosition, childPosition);
    61. if (convertView == null) {
    62. LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    63. convertView = inflater.inflate(R.layout.list_item, null);
    64. }
    65. TextView textView = convertView.findViewById(R.id.expandedListItem);
    66. textView.setText(childTitle);
    67. return convertView;
    68. }
    69. @Override
    70. public boolean isChildSelectable(int groupPosition, int childPosition) {
    71. return true;
    72. }
    73. }

    4、创建布局文件 list_group.xml 和 list_item.xml 用于分组和子项的视图:

    list_group.xml:

    1. "1.0" encoding="utf-8"?>
    2. <TextView xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:id="@+id/listTitle"
    4. android:layout_width="match_parent"
    5. android:layout_height="wrap_content"
    6. android:padding="15dp"
    7. android:textColor="@android:color/black"
    8. android:textSize="20sp" />

    list_item.xml:

    1. "1.0" encoding="utf-8"?>
    2. <TextView xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:id="@+id/expandedListItem"
    4. android:layout_width="match_parent"
    5. android:layout_height="wrap_content"
    6. android:padding="15dp"
    7. android:textColor="@android:color/darker_gray"
    8. android:textSize="18sp" />

    参考文档

    1. Android ExpandableListView

    Android ViewFlipper 翻转视图

    ViewFlipper 是 Android 中的一个 View 容器,可以用来展示多个子 View,并且支持通过动画切换这些子 View。通常用于制作引导页、轮播图等功能。

    ViewFlipper 属性

    ViewFlipper 的两个属性 android:autoStart 和 android:flipInterval 分别用于控制轮播的自动开始和轮播的时间间隔。

    • android:autoStart: 这个属性用于设置是否自动开始轮播。如果将其设置为 true,则 ViewFlipper 将会自动开始轮播子 View;如果设置为 false,则需要手动调用 startFlipping() 方法来开始轮播,默认值为 true。
    • android:flipInterval: 这个属性用于设置轮播时的时间间隔,单位为毫秒。可以通过设置这个属性来调整轮播的速度,默认值为 3000 毫秒(即 3 秒)。

    ViewFlipper 方法

    1. setInAnimation(Animation inAnimation): 设置 View 进入屏幕时使用的动画。通过传入一个 Animation 对象来设置进入动画效果。
    2. setOutAnimation(Animation outAnimation): 设置 View 退出屏幕时使用的动画。通过传入一个 Animation 对象来设置退出动画效果。
    3. showNext(): 调用该方法来显示 ViewFlipper 里的下一个 View。即切换到下一个子 View。
    4. showPrevious(): 调用该方法来显示 ViewFlipper 的上一个 View。即切换到上一个子 View。
    5. setFlipInterval(int milliseconds): 设置 View 之间切换的时间间隔,单位为毫秒。
    6. setAutoStart(boolean autoStart): 设置是否自动开始切换所有的 View。如果设为 true,ViewFlipper 会使用上面设置的时间间隔来开始切换所有的 View,切换会循环进行;如果设为 false,则需要手动调用 startFlipping() 方法来开始切换。
    7. startFlipping(): 使用上面设置的时间间隔来开始切换所有的 View,切换会循环进行。
    8. stopFlipping(): 停止 View 切换。调用该方法后,ViewFlipper 将不再自动切换 View。

    为 ViewFlipper 加入 View

    1. "1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5. android:orientation="vertical"
    6. android:gravity="center">
    7. <ViewFlipper
    8. android:id="@+id/viewFlipper"
    9. android:layout_width="match_parent"
    10. android:layout_height="match_parent"
    11. android:autoStart="true"
    12. android:flipInterval="3000">
    13. <ImageView
    14. android:layout_width="match_parent"
    15. android:layout_height="match_parent"
    16. android:src="@drawable/guide_1"
    17. android:scaleType="centerCrop"/>
    18. <ImageView
    19. android:layout_width="match_parent"
    20. android:layout_height="match_parent"
    21. android:src="@drawable/guide_2"
    22. android:scaleType="centerCrop"/>
    23. <ImageView
    24. android:layout_width="match_parent"
    25. android:layout_height="match_parent"
    26. android:src="@drawable/guide_3"
    27. android:scaleType="centerCrop"/>
    28. <ImageView
    29. android:layout_width="match_parent"
    30. android:layout_height="match_parent"
    31. android:src="@drawable/guide_4"
    32. android:scaleType="centerCrop"/>
    33. ViewFlipper>
    34. LinearLayout>

    例子:全屏幕可以滑动的引导页

    1、activity_main.xml

    1. "1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5. android:orientation="vertical"
    6. android:gravity="center">
    7. <androidx.viewpager.widget.ViewPager
    8. android:id="@+id/viewPager"
    9. android:layout_width="match_parent"
    10. android:layout_height="match_parent"/>
    11. LinearLayout>

    2、MainActivity.java

    1. package com.example.myapplication;
    2. import androidx.appcompat.app.AppCompatActivity;
    3. import androidx.viewpager.widget.ViewPager;
    4. import android.os.Bundle;
    5. public class MainActivity extends AppCompatActivity {
    6. private ViewPager viewPager;
    7. private int[] images = {R.drawable.guide_1, R.drawable.guide_2, R.drawable.guide_3, R.drawable.guide_4};
    8. @Override
    9. protected void onCreate(Bundle savedInstanceState) {
    10. super.onCreate(savedInstanceState);
    11. setContentView(R.layout.activity_main);
    12. viewPager = findViewById(R.id.viewPager);
    13. ViewPagerAdapter adapter = new ViewPagerAdapter(this, images);
    14. viewPager.setAdapter(adapter);
    15. }
    16. }

    3、ViewPagerAdapter.java

    1. package com.example.myapplication;
    2. import android.content.Context;
    3. import android.view.LayoutInflater;
    4. import android.view.View;
    5. import android.view.ViewGroup;
    6. import android.widget.ImageView;
    7. import androidx.annotation.NonNull;
    8. import androidx.viewpager.widget.PagerAdapter;
    9. public class ViewPagerAdapter extends PagerAdapter {
    10. private Context mContext;
    11. private int[] mImages;
    12. public ViewPagerAdapter(Context context, int[] images) {
    13. mContext = context;
    14. mImages = images;
    15. }
    16. @NonNull
    17. @Override
    18. public Object instantiateItem(@NonNull ViewGroup container, int position) {
    19. LayoutInflater inflater = LayoutInflater.from(mContext);
    20. View view = inflater.inflate(R.layout.item_guide, container, false);
    21. ImageView imageView = view.findViewById(R.id.imageView);
    22. imageView.setImageResource(mImages[position]);
    23. container.addView(view);
    24. return view;
    25. }
    26. @Override
    27. public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
    28. container.removeView((View) object);
    29. }
    30. @Override
    31. public int getCount() {
    32. return mImages.length;
    33. }
    34. @Override
    35. public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
    36. return view == object;
    37. }
    38. }

    4、item_guide.xml

    1. "1.0" encoding="utf-8"?>
    2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent">
    5. <ImageView
    6. android:id="@+id/imageView"
    7. android:layout_width="match_parent"
    8. android:layout_height="match_parent"
    9. android:scaleType="centerCrop" />
    10. RelativeLayout>

    参考文档

    1. Android ViewFlipper

  • 相关阅读:
    Python 内置函数详解 (2) 逻辑运算
    【免杀前置课——Windows编程】十五、网络编程——C/S,B/S模式分别是什么?WinSocket、Socket传输的定义和其特点、实现简易通信(附代码)
    好玩的调度技术
    nginx 负载均衡
    Python os模块
    电子学会青少年软件编程 Python编程等级考试二级真题解析(判断题)2021年6月
    软件测试/测试开发丨利用ChatGPT 生成自动化测试脚本
    ESP8266-Arduino编程实例-OLED显示BMP180传感器数据
    Oracle基础入门
    MyBatis实现动态SQL更新
  • 原文地址:https://blog.csdn.net/m0_74293254/article/details/136366156