當前位置:首頁 » 安卓系統 » android樹形列表

android樹形列表

發布時間: 2023-08-27 15:59:56

A. Android RecyclerView實現循環列表-點擊事件

源碼鏈接

效果圖

實現步驟:

1.在build.gradle文件中加入recyclerView庫

2.在main.xml中使用recyclerView布局

3.滾動列表中的每一項對應一個對象,他們屬於同一類的實例。接著定義實體類,我做的是歌單列表,定義序號,名字和時長

4.設計列表項的樣式

4.使用適配器為列表項設置顯示的數據

4.1定義適配器的內部類與列表項綁定

4.2適配器繼承自recyclerView.Adapter,要重寫三個方法,創建列表項視圖,復用載入,獲取列表項數量,到這一步,循環列表已經可以實現滾動效果了。

5.為列表項添加點擊監聽事件,使用介面回調

5.1仍然是在適配器中,定義介面

5.2在onBindViewHolder中為列表項設置監聽

5.3在MainActivity中使用,實現onclick方法

B. android ListView用法和屬性

ListView是一個用來縱向顯示條目的視圖,這些條目內容來自於與該ListView相關聯的ListAdapter.
android:divider//在列表條目之間顯示的drawable或color
android:dividerHeight//用來指定divider的高度
android:entries//構成ListView的數組資源的引用。對於某些固定的資源,這個屬性提供了比在程序中添加資源更加簡便的方式
android:footerDividersEnabled//當設為false時,ListView將不會在各個footer之間繪制divider.默認為true。
android:headerDividersEnabled//當設為false時,ListView將不會在各個header之間繪制divider.默認為true
android:cacheColorHint// 表明這個列表的背景始終以單一、固定的顏色繪制,可以優化繪制過程。
android:choiceMode//為視圖指定選擇的行為。可選的類型有:none、singleChoice、multipleChoice、multipleChoiceModal。
android:drawSelectorOnTop// 若設為true,選擇器將繪制在選中條目的上層。默認為false。
android:fastScrollEnabled// 設置是否允許使用快速滾動滑塊。
android:addStatesFromChildren// 設置這個ViewGroup的drawable狀態是否包括子View的狀態。若設為true,當子View如EditText或Button獲得焦點時,整個ViewGroup也會獲得焦點。
android:alwaysDrawnWithCache// 設置ViewGroup在繪制子View時是否一直使用繪圖緩存。默認為true。
android:animationCache// 設置布局在繪制動畫效果時是否為其子View創建繪圖緩存。若設為true,將會消耗更多的內存,要求持續時間更久的初始化過程,但表現更好。默認為true。
android:clipChildren// 設置子View是否受限於在自己的邊界內繪制。若設為false,當子View所佔用的空間大於邊界時可以繪制在邊界外。默認為true。
android:clipToPadding//定義布局間是否有間距。默認為true。
android:descendantFocusability// 定義當尋找一個焦點View的時候,ViewGroup與其子View之間的關系。可選項為:
//(1)beforeDescendants ViewGroup會比其子View更先獲得焦點;
//(2)afterDescendants 只有當無子View想要獲取焦點時,ViewGroup才會獲取焦點;
//(3)blockDescendants ViewGroup會阻止子View獲取焦點
android:layoutAnimation//定義當ViewGroup第一次展開時的動畫效果,也可人為地在第一次展開後調用。
android:persistentDrawingCache// 定義繪圖緩存的持久性。有如下可選項:
//(1)none 當使用過後不保留繪圖緩存
//(2)animation 在layout animation之後保留繪圖緩存
//(3)scrolling 在Scroll操作後保留繪圖緩存
//(4)all always保留繪圖緩存
android:listSelector// 設置選中項顯示的可繪制對象,可以是圖片或者顏色屬性。
android:scrollingCache// 設置在滾動時是否使用繪制緩存。若設為true,則將使滾動表現更快速,但會佔用更內存。默認為true。
android:smoothScrollbar// 為真時,列表會使用更精確的基於條目在屏幕上的可見像素高度的計算方法。默認該屬性為真,如果你的適配器需要繪制可變高的條目,他應該設為假。當該屬性為真時,你在適配器在顯示變高條目時,滾動條的把手會在滾動的過程中改變大小。當設為假時,列表只使用適配器中的條目數和屏幕上的可見條目來決定滾動條的屬性。
android:stackFromBottom// 設置GridView和ListView是否將內容從底部開始顯示。
android:textFilterEnabled// 當設為真時,列表會將結果過濾為用戶類型。前提是這個列表的Adapter必須支持Filterable介面。
android:transcriptMode//設置列表的transcriptMode.有如下選項可選:
//(1)disabled 禁用TranscriptMode,也是默認值;
//(2)normal 當新條目添加進列表中並且已經准備好顯示的時候,列表會自動滑動到底部以顯示最新條目;
//(3)alwaysScroll 列表會自動滑動到底部,無論新條目是否已經准備好顯示.
目前推薦用的是 RecycleView

C. 一行代碼搞定 Android 復雜列表埋點曝光

一個好的產品離不開數據分析,在手機 APP 中,數據分析極致化需要細致到某個時刻列表曝光的了哪幾個 Item。

2022 年了,基本上目前 Android 上可以滑動的復雜列表都是 RecyclerView 或者其擴展,這里分享一個封裝的思路。

如果非要細化細節:

各種方案核心都差不多,最關鍵的就是通過 LayoutManager 獲取屏幕內第一個可見和最後一個可見 item position,上報其區間內的 Item。這里簡稱這個邏輯為 檢查上報邏輯

但是觸發時機有所不同,通常如下方案一和二所述,當然除了方案一和方案二外,還有一些別的方案,比如監聽 RecyclerView 的布局樹變化觸發 檢查上報邏輯 等方案。

可以發現方案二相比方案一更有利於減少各種回調的注冊和周期的控制,下文會在方案二的基礎上,闡述用法和相關實現思路。

倉庫地址: RecyclerViewExposure

這里會主要說明一些主要邏輯,需要完整的邏輯可以 fork 倉庫 查看

思路來自於 lifecycle 的設計,這里主要是想讓 Activity/Fragment 提供可見和不可見的狀態變化給外部訂閱

對 List Item 的收集處理是 RecyclerViewExposure 最核心的收集數據邏輯,這里針對在 Activity 的使用作為例子。上文已經講述如何做一個 PageLifeCycleHolder 為其他組件提供頁面可見狀態,下文將直接使用。

D. Android項目目錄哪個視圖中的樹形結構和實際工程文件夾存儲相同

Android視圖:app/manifests
Project視圖對應的文件夾:app/src/main/AndroidManifest.xml
Android視圖:app/java
Project視圖對應的文件夾:app/src/main/java
Android視圖:app/cpp
Project視圖對應的文件夾:app/src/main/jni
Android視圖:app/aidl
Project視圖對應的文件夾:app/src/main/aidl
Android視圖:app/renderscript
Project視圖對應的文件夾:app/src/main/rs

E. 如何在Android開發中動態載入的list列表數據

Android中載入list列表數據主要是通過Adapter實現,可用顯示列表的控制項如下:

  1. Listview

  2. GridView

  3. ExpandListview

顯示具體的數據需要通過Adapter實現,Android目前有4種Adapter:

  1. ArrayAdapter

  2. SimpleAdapter

  3. SimpleCursorAdapter

  4. BaseAdapter ( 自定義Adapter)

具體操作步驟 ( 以自定義Adapter為例):

  1. 在xml中定義Listview布局

  2. 在代碼中通過ID找到Listview控制項

  3. 構建Adapter對象,新建一個類繼承自BaseAdapter,重寫它的四個方法,具體如下代碼

  4. 構造好適配器後設置Listview的adapter對象為新建的適配器,界面即可顯示數據

  5. 在數據變動的地方,只需要調用adapter的notifyDataSetChanged方法即可刷新界面


  6. packagecom.beryl.gougou;

    importandroid.content.Context;
    importandroid.view.LayoutInflater;
    importandroid.view.View;
    importandroid.view.ViewGroup;
    importandroid.widget.BaseAdapter;

    importjava.util.List;

    /**
    *Createdbyyton16/11/14.
    */

    {
    privateList<String>datalist;
    privateLayoutInflaterinflater;

    publicMyAdapter(Contextcontext,List<String>datalist){
    this.datalist=datalist;
    inflater=LayoutInflater.from(context);
    }

    @Override
    publicintgetCount(){
    returndatalist.size();
    }

    @Override
    publicObjectgetItem(intposition){
    returndatalist.get(position);
    }

    @Override
    publiclonggetItemId(intposition){
    returnposition;
    }

    @Override
    publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
    //此處參考網上的view緩存機制,示例demo不多說明
    returnnull;
    }


    }

F. android的系統架構_Android的系統架構中包含有哪幾層分別有什麼作用

Android的系統架構和其操作系統一樣,採用了分層的架構。從架構圖看,Android分為四個層,從高層到低層分別是應用程序層、應用程序框架層、系統運行庫層和linux內核層。

應用程序

Android會同一系列核心應用程序包一起發布,該應用程序包包括客戶端,SMS短消息程序,日歷,地圖,瀏覽器,聯系人管理程序等。所有的應用程序都是使用JAVA語言編寫的。

應用程序族滲檔框架

開發人員也可以完全訪問核心應用程序所使用的API框架。該應用程序的架構設計簡化了組件的重用;任何一個應用程序都可以發布它的功能塊並且任何其它的應用程序都可以使用其所發布的功能塊(不過得遵循框架的安全性)。同樣,該應用程序重用機制也使用戶可以方便的替換程序組件。

隱藏在每個應用後面的是一系列的服務和系統,其中包括;

豐富而又可擴展的視圖(Views),可以用來構建應用程序,它包括列表(Lists),網格(Grids),文本框(Textboxes),按鈕(Buttons),甚至可嵌入的web瀏覽器。

內容提供器(ContentProviders)使得應用程序可以訪問另一個應用程序的數據(如聯系人資料庫),或者共享它們自己的數據

資源管理器(ResourceManager)提供非代碼資源的訪問,如本地字元串,圖形,和布局文件(Layoutfiles)。

通知管理器(Manager)使得應用程兆亂序可以在狀態欄中顯示自定義的提示信息。

活動管理器(ActivityManager)用來管理應用程序生命周期並提供常用的導航回退功能。

系統運行庫

Android包含一些C/C庫,這些庫能被Android系統中不同喊世的組件使用。它們通過Android應用程序框架為開發者提供服務。以下是一些核心庫:

*系統C庫-一個從BSD繼承來的標准C系統函數庫Libc),它是專門為基於Embeddedlinux的設備定製的。

*媒體庫-基於PacketVideoOpenCORE;該庫支持多種常用的音頻、視頻格式回放和錄制,同時支持靜態圖像文件。編碼格式包括MPEG4,H.264,MP3,AAC,AMR,JPG,PNG。

*SurfaceManager-對顯示子系統的管理,並且為多個應用程序提供了2D和3D圖層的無縫融合。

*LibWebCore-一個最新的web瀏覽器引擎用,支持Android瀏覽器和一個可嵌入的web視圖。

G. android打造任意層級的樹形控制項那個id能不能用string

由於整體比較長,我決定首先帶大家看一下用法,就是如果學完了這篇博客,我們需要樹形控制項,我們需要花多少精力去完成~~
現在需求來了:我現在需要展示一個文件管理系統的樹形結構:
數據是這樣的:

//id , pid , label , 其他屬性
mDatas.add(new FileBean(1, 0, "文件管理系統"));
mDatas.add(new FileBean(2, 1, "游戲"));
mDatas.add(new FileBean(3, 1, "文檔"));
mDatas.add(new FileBean(4, 1, "程序"));
mDatas.add(new FileBean(5, 2, "war3"));
mDatas.add(new FileBean(6, 2, "刀塔傳奇"));

mDatas.add(new FileBean(7, 4, "面向對象"));
mDatas.add(new FileBean(8, 4, "非面向對象"));

mDatas.add(new FileBean(9, 7, "C++"));
mDatas.add(new FileBean(10, 7, "JAVA"));
mDatas.add(new FileBean(11, 7, "Javascript"));
mDatas.add(new FileBean(12, 8, "C"));

當然了,bean可以有很多屬性,我們提供你動態的設置樹節點上的顯示、以及不約束id, pid 的命名,你可以起任意喪心病狂的屬性名稱;

那麼我們如何確定呢?
看下Bean:

package com.zhy.bean;

import com.zhy.tree.bean.TreeNodeId;
import com.zhy.tree.bean.TreeNodeLabel;
import com.zhy.tree.bean.TreeNodePid;

public class FileBean
{
@TreeNodeId
private int _id;
@TreeNodePid
private int parentId;
@TreeNodeLabel
private String name;
private long length;
private String desc;

public FileBean(int _id, int parentId, String name)
{
super();
this._id = _id;
this.parentId = parentId;
this.name = name;
}

}

現在,不用說,應該也知道我們通過註解來確定的。

下面看我們如何將這數據轉化為樹
布局文件就一個listview,就補貼了,直接看Activity

package com.zhy.tree_view;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

import com.zhy.bean.FileBean;
import com.zhy.tree.bean.TreeListViewAdapter;

public class MainActivity extends Activity
{
private List<FileBean> mDatas = new ArrayList<FileBean>();
private ListView mTree;
private TreeListViewAdapter mAdapter;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

initDatas();
mTree = (ListView) findViewById(R.id.id_tree);
try
{

mAdapter = new SimpleTreeAdapter<FileBean>(mTree, this, mDatas, 10);
mTree.setAdapter(mAdapter);
} catch (IllegalAccessException e)
{
e.printStackTrace();
}

}

private void initDatas()
{

// id , pid , label , 其他屬性
mDatas.add(new FileBean(1, 0, "文件管理系統"));
mDatas.add(new FileBean(2, 1, "游戲"));
mDatas.add(new FileBean(3, 1, "文檔"));
mDatas.add(new FileBean(4, 1, "程序"));
mDatas.add(new FileBean(5, 2, "war3"));
mDatas.add(new FileBean(6, 2, "刀塔傳奇"));

mDatas.add(new FileBean(7, 4, "面向對象"));
mDatas.add(new FileBean(8, 4, "非面向對象"));

mDatas.add(new FileBean(9, 7, "C++"));
mDatas.add(new FileBean(10, 7, "JAVA"));
mDatas.add(new FileBean(11, 7, "Javascript"));
mDatas.add(new FileBean(12, 8, "C"));

}

}

Activity裡面並沒有什麼特殊的代碼,拿到listview,傳入mData,當中初始化了一個Adapter;

看來我們的核心代碼都在我們的Adapter裡面:
那麼看一眼我們的Adapter

package com.zhy.tree_view;

import java.util.List;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.zhy.tree.bean.Node;
import com.zhy.tree.bean.TreeListViewAdapter;

public class SimpleTreeAdapter<T> extends TreeListViewAdapter<T>
{

public SimpleTreeAdapter(ListView mTree, Context context, List<T> datas,
int defaultExpandLevel) throws IllegalArgumentException,
IllegalAccessException
{
super(mTree, context, datas, defaultExpandLevel);
}

@Override
public View getConvertView(Node node , int position, View convertView, ViewGroup parent)
{

ViewHolder viewHolder = null;
if (convertView == null)
{
convertView = mInflater.inflate(R.layout.list_item, parent, false);
viewHolder = new ViewHolder();
viewHolder.icon = (ImageView) convertView
.findViewById(R.id.id_treenode_icon);
viewHolder.label = (TextView) convertView
.findViewById(R.id.id_treenode_label);
convertView.setTag(viewHolder);

} else
{
viewHolder = (ViewHolder) convertView.getTag();
}

if (node.getIcon() == -1)
{
viewHolder.icon.setVisibility(View.INVISIBLE);
} else
{
viewHolder.icon.setVisibility(View.VISIBLE);
viewHolder.icon.setImageResource(node.getIcon());
}
viewHolder.label.setText(node.getName());

return convertView;
}

private final class ViewHolder
{
ImageView icon;
TextView label;
}

}

我們的SimpleTreeAdapter繼承了我們的TreeListViewAdapter ; 除此之外,代碼上只需要復寫getConvertView , 且getConvetView其實和我們平時的getView寫法一致;

公布出getConvertView 的目的是,讓用戶自己去決定Item的展示效果。其他的代碼,我已經打包成jar了,用的時候導入即可。這樣就完成了我們的樹形控制項。
也就是說用我們的樹形控制項,只需要將傳統繼承BaseAdapter改為我們的TreeListViewAdapter ,然後去實現getConvertView 就好了。

熱點內容
群暉怎麼玩安卓模擬器 發布:2025-02-02 09:45:23 瀏覽:550
三星安卓12彩蛋怎麼玩 發布:2025-02-02 09:44:39 瀏覽:736
電腦顯示連接伺服器錯誤 發布:2025-02-02 09:24:10 瀏覽:529
瑞芯微開發板編譯 發布:2025-02-02 09:22:54 瀏覽:139
linux虛擬機用gcc編譯時顯示錯誤 發布:2025-02-02 09:14:01 瀏覽:227
java駝峰 發布:2025-02-02 09:13:26 瀏覽:644
魔獸腳本怎麼用 發布:2025-02-02 09:10:28 瀏覽:527
linuxadobe 發布:2025-02-02 09:09:43 瀏覽:205
sql2000資料庫連接 發布:2025-02-02 09:09:43 瀏覽:720
加密狗硬體克隆 發布:2025-02-02 08:59:16 瀏覽:462