學習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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center"><ExpandableListViewandroid:id="@+id/expandableListView"android:layout_width="match_parent"android:layout_height="match_parent" />
</LinearLayout>

2、修改 MainActivity.java

package com.example.myapplication;import android.os.Bundle;
import android.widget.ExpandableListView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;public class MainActivity extends AppCompatActivity {ExpandableListView expandableListView;List<String> listGroup;HashMap<String, List<String>> listItem;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);expandableListView = findViewById(R.id.expandableListView);// 準備數據prepareListData();// 創建并設置適配器MyAdapter adapter = new MyAdapter(this, listGroup, listItem);expandableListView.setAdapter(adapter);// 設置分組項點擊監聽器expandableListView.setOnGroupClickListener((parent, v, groupPosition, id) -> {Toast.makeText(MainActivity.this,"Group Clicked " + listGroup.get(groupPosition),Toast.LENGTH_SHORT).show();return false;});// 設置子項點擊監聽器expandableListView.setOnChildClickListener((parent, v, groupPosition, childPosition, id) -> {Toast.makeText(MainActivity.this,"單擊的子項 " + listItem.get(listGroup.get(groupPosition)).get(childPosition),Toast.LENGTH_SHORT).show();return false;});}// 準備數據private void prepareListData() {listGroup = new ArrayList<>();listItem = new HashMap<>();listGroup.add("水果");listGroup.add("蔬菜");listGroup.add("動物");List<String> fruits = new ArrayList<>();fruits.add("蘋果");fruits.add("香蕉");fruits.add("芒果");List<String> vegetables = new ArrayList<>();vegetables.add("胡蘿卜");vegetables.add("菠菜");vegetables.add("番茄");List<String> animals = new ArrayList<>();animals.add("狗");animals.add("貓");animals.add("大象");listItem.put(listGroup.get(0), fruits);listItem.put(listGroup.get(1), vegetables);listItem.put(listGroup.get(2), animals);}
}

3、創建適配器類 MyAdapter.java

package com.example.myapplication;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;
import java.util.HashMap;
import java.util.List;public class MyAdapter extends BaseExpandableListAdapter {private Context context;private List<String> listGroup;private HashMap<String, List<String>> listItem;public MyAdapter(Context context, List<String> listGroup, HashMap<String, List<String>> listItem) {this.context = context;this.listGroup = listGroup;this.listItem = listItem;}@Overridepublic int getGroupCount() {return listGroup.size();}@Overridepublic int getChildrenCount(int groupPosition) {return listItem.get(listGroup.get(groupPosition)).size();}@Overridepublic Object getGroup(int groupPosition) {return listGroup.get(groupPosition);}@Overridepublic Object getChild(int groupPosition, int childPosition) {return listItem.get(listGroup.get(groupPosition)).get(childPosition);}@Overridepublic long getGroupId(int groupPosition) {return groupPosition;}@Overridepublic long getChildId(int groupPosition, int childPosition) {return childPosition;}@Overridepublic boolean hasStableIds() {return false;}@Overridepublic View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {String groupTitle = (String) getGroup(groupPosition);if (convertView == null) {LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);convertView = inflater.inflate(R.layout.list_group, null);}TextView textView = convertView.findViewById(R.id.listTitle);textView.setText(groupTitle);return convertView;}@Overridepublic View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {String childTitle = (String) getChild(groupPosition, childPosition);if (convertView == null) {LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);convertView = inflater.inflate(R.layout.list_item, null);}TextView textView = convertView.findViewById(R.id.expandedListItem);textView.setText(childTitle);return convertView;}@Overridepublic boolean isChildSelectable(int groupPosition, int childPosition) {return true;}
}

4、創建布局文件 list_group.xml 和 list_item.xml 用于分組和子項的視圖:

list_group.xml:

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

list_item.xml:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/expandedListItem"android:layout_width="match_parent"android:layout_height="wrap_content"android:padding="15dp"android:textColor="@android:color/darker_gray"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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center"><ViewFlipperandroid:id="@+id/viewFlipper"android:layout_width="match_parent"android:layout_height="match_parent"android:autoStart="true"android:flipInterval="3000"><ImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:src="@drawable/guide_1"android:scaleType="centerCrop"/><ImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:src="@drawable/guide_2"android:scaleType="centerCrop"/><ImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:src="@drawable/guide_3"android:scaleType="centerCrop"/><ImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:src="@drawable/guide_4"android:scaleType="centerCrop"/></ViewFlipper>
</LinearLayout>

例子:全屏幕可以滑動的引導頁

1、activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:gravity="center"><androidx.viewpager.widget.ViewPagerandroid:id="@+id/viewPager"android:layout_width="match_parent"android:layout_height="match_parent"/>
</LinearLayout>

2、MainActivity.java

package com.example.myapplication;import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;
import android.os.Bundle;public class MainActivity extends AppCompatActivity {private ViewPager viewPager;private int[] images = {R.drawable.guide_1, R.drawable.guide_2, R.drawable.guide_3, R.drawable.guide_4};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);viewPager = findViewById(R.id.viewPager);ViewPagerAdapter adapter = new ViewPagerAdapter(this, images);viewPager.setAdapter(adapter);}
}

3、ViewPagerAdapter.java

package com.example.myapplication;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.viewpager.widget.PagerAdapter;public class ViewPagerAdapter extends PagerAdapter {private Context mContext;private int[] mImages;public ViewPagerAdapter(Context context, int[] images) {mContext = context;mImages = images;}@NonNull@Overridepublic Object instantiateItem(@NonNull ViewGroup container, int position) {LayoutInflater inflater = LayoutInflater.from(mContext);View view = inflater.inflate(R.layout.item_guide, container, false);ImageView imageView = view.findViewById(R.id.imageView);imageView.setImageResource(mImages[position]);container.addView(view);return view;}@Overridepublic void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {container.removeView((View) object);}@Overridepublic int getCount() {return mImages.length;}@Overridepublic boolean isViewFromObject(@NonNull View view, @NonNull Object object) {return view == object;}
}

4、item_guide.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:id="@+id/imageView"android:layout_width="match_parent"android:layout_height="match_parent"android:scaleType="centerCrop" /></RelativeLayout>

參考文檔

  1. Android ViewFlipper

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717114.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717114.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717114.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【MySQL】索引(重點)-- 詳解

一、索引 沒有索引&#xff0c;可能會有什么問題&#xff1f; 索引 &#xff1a;提高數據庫的性能&#xff0c;索引是物美價廉的東西了。不用加內存&#xff0c;不用改程序&#xff0c;不用調 sql &#xff0c;只要執行正確的 create index &#xff0c;查詢速度就可能提高成…

加密與安全_探索數字證書

文章目錄 Pre概述使用keytool生成證書使用Openssl生成證書 &#xff08;推薦&#xff09;證書的吊銷小結 Pre PKI - 借助Nginx 實現Https 服務端單向認證、服務端客戶端雙向認證 PKI - 04 證書授權頒發機構&#xff08;CA&#xff09; & 數字證書 PKI - 數字簽名與數字證…

java面試題(spring框架篇)(黑馬 )

樹形圖&#xff1a; 一、Spring框架種的單例bean是線程安全嗎&#xff1f; Service Scope("singleton") public class UserServiceImpl implements UserService{ } singleton:bean在每個Spring IOC容器中只有一個實例 protype&#xff1a;一個bean的定義可以有多個…

CPU iowait是什么意思

在linux系統&#xff0c;使用top命令時&#xff0c;可以看到cpu使用統計情況&#xff0c;有時我們會注意到iowait這一項非常高。我們直到&#xff0c;在cpu運行進程、線程時&#xff0c;遇到IO操作&#xff0c;因為IO讀寫通常比較慢&#xff0c;CPU通常可以阻塞線程&#xff0c…

【Web安全靶場】xss-labs-master 1-20

xss-labs-master 其他靶場見專欄 文章目錄 xss-labs-masterlevel-1level-2level-3level-4level-5level-6level-7level-8level-9level-10level-11level-12level-13level-14level-15level-16level-17level-18level-19level-20 level-1 第一關沒有進行任何限制&#xff0c;get請求…

pytorch_神經網絡構建6

文章目錄 強化學習概念實現qLearning基于這個思路,那么解決這個問題的代碼如下 強化學習概念 強化學習有一個非常直觀的表現&#xff0c;就是從出發點到目標之間存在著一個連續的狀態轉換&#xff0c;比如說從狀態一到狀態456&#xff0c;而每一個狀態都有多種的行為&#xff…

全國青少年軟件編程(Python)等級考試試卷(一級) 測試卷2021年12月

第 1 題 【 單選題 】 下面程序的運行結果是什么&#xff1f;&#xff08; &#xff09; a10 b5 ca*b print(c) A :10 B :15 C :50 D :5 正確答案:C 試題解析: 第 2 題 【 單選題 】 與a>b and b>c等價的是&#xff1f;&#xff08; &#xff09; A…

設計模式學習筆記 - 設計原則 - 1.單一職責原則

前言 前面我們提到過 SOLID 原則&#xff0c;實際上 SOLID 由 5 個設計原則組成&#xff0c;分別是&#xff1a;單一職責原則、開閉原則、里氏替換原則、接口隔離原則和依賴反轉原則。它們分別對應 SLOID 中的 S、O、L、I、D 這 5 個英文字母。 今天來學習下 SOLID 原則中的第…

Libevent的使用及reactor模型

Libevent 是一個用C語言編寫的、輕量級的開源高性能事件通知庫&#xff0c;主要有以下幾個亮點&#xff1a;事件驅動&#xff08; event-driven&#xff09;&#xff0c;高性能;輕量級&#xff0c;專注于網絡&#xff0c;不如 ACE 那么臃腫龐大&#xff1b;源代碼相當精煉、易讀…

【Java】Java 中的方法引用寫法

概述 方法引用&#xff08;MethodReference&#xff09;是Lambda表達式的另一種格式&#xff0c;在某些場景下可以提高代碼的可讀性 使用條件 只可以替換單方法的Lambda表達式 什么意思呢 &#xff1f; 例如下面這個Lambda表達式就不可以使用方法引用替換&#xff0c;因為…

100243. 將元素分配到兩個數組中 I

說在前面 &#x1f388;不知道大家對于算法的學習是一個怎樣的心態呢&#xff1f;為了面試還是因為興趣&#xff1f;不管是出于什么原因&#xff0c;算法學習需要持續保持。 題目描述 給你一個下標從 1 開始、包含 不同 整數的數組 nums &#xff0c;數組長度為 n 。 你需要通…

C語言 快速排序——qsort函數的介紹

qsort函數 1. 函數介紹2. 函數使用2.1 整型排序2.2 字符排序2.3 字符串排序2.4 結構體排序 3. 用冒泡思想模擬qsort函數 我們以往使用冒泡排序和選擇排序等對數據進行排序時&#xff0c;有可能會遇到搞不清排序次數&#xff0c;運行時間過長等一些問題&#xff0c;并且這些排序…

aop監控spring cloud接口超時,并記錄到數據庫

引入pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0…

寶塔面板安裝各種組件以及部署應用服務

在linux服務器安裝寶塔面板 一、從寶塔官網下載exe安裝包&#xff0c;安裝命令從寶塔官網&#xff08;https://www.bt.cn/&#xff09;獲取 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh二、安…

自動駕駛加速落地,激光雷達放量可期(上)

1 激光雷達應用廣泛&#xff0c;汽車有望成最大催化 激光雷達&#xff08;LiDAR&#xff09;是一種主動遙感技術&#xff0c;通過測定傳感器發出的激光在傳感器與目標物體之間的傳播距離&#xff0c;來分析目標地物表面的反射能量大小、反射波譜的幅度、頻率和相位等信息&#…

Vue項目如何進行優化?

Vue項目優化 1.移除控制臺打印2.壓縮圖片3.CDN加速 1.移除控制臺打印 可以使用插件自動去除&#xff0c;插件包括babel-plugin-transform-remove-console、uglifyjs-webpack-plugin、terser-webpack-plugin。最后選擇了terser-webpack-plugin&#xff0c;腳手架vue-cli用這個插…

一文掃盲:訂單管理系統,訂單是公司生命線。

hello&#xff0c;我是貝格前端工場&#xff0c;本期給大家分享訂單管理系統的知識點&#xff0c;歡迎老鐵們點贊、關注&#xff0c;如有需求可以私信我們。 一、什么是訂單管理系統 單管理系統是一種用于管理和處理訂單的軟件系統。它通常用于企業、電子商務平臺、零售店等需…

高并發高可用--反向代理與負載均衡

高并發高可用架構是指能夠應對大量并發請求并保持高度可用的系統架構。為了實現這一目標&#xff0c;通常會采用一系列技術和策略&#xff0c;包括負載均衡、緩存、分布式系統、冗余部署、容錯處理等。 以下是一些構建高并發高可用架構的關鍵要點&#xff1a; 負載均衡&#…

GEE高階應用python wxee 和eemont——MODIS 中生成NDVI 數據的月度時序影像

結合 wxee 和 eemont eemont概述 谷歌地球引擎是一種基于云的服務,用于矢量和柵格數據的地理空間處理。地球引擎平臺擁有 JavaScript 和 Python API,可使用不同方法處理地理空間對象。谷歌地球引擎還提供了一個巨大的 PETABYTE 級柵格和矢量數據目錄,用戶可以在線處理這些…

技術小知識:面向對象和過程的區別 ⑤

一、思想區別 面相對象&#xff1a;始終把所有事情思考歸類、抽離封裝成對象來調用完成。 面向過程&#xff1a;直接平鋪展開按順序執行完成任務。 面向對象多了很多對象的創建、使用&#xff0c;銷毀的過程資源消耗。是一種模塊化編程思想。 https://www.cnblogs.com/kuangmen…