Android樹(shù)形控件的實(shí)現(xiàn)方法
在PC上我們已經(jīng)習(xí)慣了樹(shù)形控件,因?yàn)槠淇梢郧逦恼宫F(xiàn)各個(gè)節(jié)點(diǎn)之間的層次結(jié)果,但是在Android平臺(tái)上,系統(tǒng)并沒(méi)有提供這樣一個(gè)控件,而是只有ListView。不過(guò)通過(guò)改寫與ListView綁定的Adapter可以實(shí)現(xiàn)這樣一個(gè)效果。
一個(gè)ListView需要和一個(gè)Adapter綁定,用于管理數(shù)據(jù)。在這里以BaseAdapter為例,繼承Adapter需要重寫四個(gè)函數(shù),其中較為重要的是兩個(gè):
1 public int getCount();//該函數(shù)返回ListView 的ListItem的條數(shù)
2 public View getView(int position, View view, ViewGroup arg2)//負(fù)責(zé)繪制每一個(gè)item。如果getCount()返回10,那么getView()就會(huì)被調(diào)用10次。
首先開(kāi)發(fā)自己的數(shù)據(jù)結(jié)構(gòu):
package bupt.liyazhou.ui; import java.util.ArrayList; import java.util.List; /* * @ author:liyazhou * @date:2013.4.29 * @description:Node類用來(lái)在UI層中存儲(chǔ)一個(gè)節(jié)點(diǎn)的信息 * */ public class Node { private Node parent=null;//父節(jié)點(diǎn) private List<Node> children=null; private String oid=null;//該節(jié)點(diǎn)的oid private String name=null;//該節(jié)點(diǎn)信息的描述 private String value=null;//該節(jié)點(diǎn)的值 private boolean isLeaf=false;//是否為葉節(jié)點(diǎn) private boolean isExpanded=false;//該節(jié)點(diǎn)是否展開(kāi) private int icon=-1;//該節(jié)點(diǎn)的圖標(biāo)對(duì)應(yīng)的id private int iconForExpandedOrFolded=-1; private int iconForExpanding=-1; private int iconForFolding=-1; private boolean tableItemOrNot=false;//表示是否為表結(jié)構(gòu)的一列 public Node(Node parent,String oid,String description,boolean isLeaf,int icon,int exIcon,int foIcon) { this.parent=parent; this.oid=oid; this.name=description; this.isLeaf=isLeaf; this.icon=icon; this.iconForExpanding=exIcon; this.iconForFolding=foIcon; } public void setTableItemOrNot(boolean tableItemOrNot) { this.tableItemOrNot=tableItemOrNot; } public boolean getTableItemOrNot() { return this.tableItemOrNot; } //設(shè)置value public void setValue(String value) { this.value=value; } //得到value public String getValue() { return this.value; } //設(shè)置圖標(biāo) public void setIcon(int icon) { this.icon=icon; } public int getIcon() { return this.icon; } //得到description public String getDescription() { return this.name; } //得到oid public String getOid() { return this.oid; } //得到是否為葉節(jié)點(diǎn) public boolean isLeafOrNot() { return this.isLeaf; } //得到當(dāng)前節(jié)點(diǎn)所在的層數(shù),根為0層 public int getLevel() { return parent==null?0:parent.getLevel()+1; } //設(shè)置是否展開(kāi) public void setExpanded(boolean isExpanded) { this.isExpanded=isExpanded; } public boolean getExpanded() { return this.isExpanded; } //添加子節(jié)點(diǎn) public void addChildNode(Node child) { if(this.children==null) { this.children=new ArrayList<Node>(); } this.children.add(child); } //清空子節(jié)點(diǎn) public void clearChildren() { if(!this.children.equals(null)) { this.children.clear(); } } //是否為根節(jié)點(diǎn) public boolean isRoot() { return this.parent.equals(null)?true:false; } //設(shè)置展開(kāi)圖標(biāo) public void setExpandIcon(int expand) { this.iconForExpanding=expand; } //設(shè)置折疊圖標(biāo) public void setFoldIcon(int fold) { this.iconForFolding=fold; } //得到展開(kāi)或折疊圖標(biāo) public int getExpandOrFoldIcon() { if(this.isExpanded==true) return this.iconForExpanding; else return this.iconForFolding; } //得到子樹(shù) public List<Node> getChildren() { return this.children; } }
然后寫自己的Adapter
package bupt.liyazhou.ui; import java.util.ArrayList; import java.util.List; import android.R; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; public class MibTreeListAdapter extends BaseAdapter { private Context context=null; private List<Node> nodeList=new ArrayList<Node> ();//所有的節(jié)點(diǎn) private List<Node> nodeListToShow=new ArrayList<Node>();//要展現(xiàn)的節(jié)點(diǎn) private LayoutInflater inflater=null; private Node root=null; public MibTreeListAdapter(Context con,Node Root,int layout) { this.context=con; this.inflater=(LayoutInflater)con.getSystemService(Context.LAYOUT_INFLATER_SERVICE); establishNodeList(Root); this.root=Root; setNodeListToShow(); } public void establishNodeList(Node node) { nodeList.add(node); if(node.isLeafOrNot()) return; List<Node> children=node.getChildren(); for(int i=0;i<children.size();i++) { establishNodeList(children.get(i)); } } public void setNodeListToShow() { this.nodeListToShow.clear(); establishNodeListToShow(this.root); } //構(gòu)造要展示在listview的nodeListToShow public void establishNodeListToShow(Node node) { this.nodeListToShow.add(node); if(node.getExpanded()&&!node.isLeafOrNot()&&node.getChildren()!=null) { List<Node> children=node.getChildren(); for(int i=0;i<children.size();i++) { establishNodeListToShow(children.get(i)); } } } //根據(jù)oid得到某一個(gè)Node,并更改其狀態(tài) public void changeNodeExpandOrFold(int position) { String oid=this.nodeListToShow.get(position).getOid(); for(int i=0;i<this.nodeList.size();i++) { if(nodeList.get(i).getOid().equals(oid)) { boolean flag=nodeList.get(i).getExpanded(); nodeList.get(i).setExpanded(!flag); } } } //listItem被點(diǎn)擊的響應(yīng)事件 public Node OnListItemClick(int position) { Node node=this.nodeListToShow.get(position); if(node.isLeafOrNot()) { //處理snmp代碼 Toast.makeText(this.context, "該節(jié)點(diǎn)為子節(jié)點(diǎn)", Toast.LENGTH_SHORT).show(); return node; } else { this.changeNodeExpandOrFold(position); this.setNodeListToShow(); this.notifyDataSetChanged(); return null; } } public int getCount() { // TODO Auto-generated method stub return nodeListToShow.size(); } public Object getItem(int arg0) { // TODO Auto-generated method stub return nodeListToShow.get(arg0); } public long getItemId(int arg0) { // TODO Auto-generated method stub return arg0; } public View getView(int position, View view, ViewGroup parent) { // TODO Auto-generated method stub Holder holder=null; if(view!=null) { holder=(Holder)view.getTag(); } else { holder=new Holder(); view=this.inflater.inflate(bupt.liyazhou.R.layout.listview_item, null); holder.description=(TextView)view.findViewById(bupt.liyazhou.R.id.textview_nodeDescription); holder.nodeIcon=(ImageView)view.findViewById(bupt.liyazhou.R.id.imageview_nodeImage); holder.expandOrFoldIcon=(ImageView)view.findViewById(bupt.liyazhou.R.id.imageview_expandedImage); view.setTag(holder); } //繪制一個(gè)item //設(shè)置文字 Node node= this.nodeListToShow.get(position); holder.description.setText(node.getDescription()); //設(shè)置圖標(biāo) int icon=node.getIcon(); if(icon!=-1) { holder.nodeIcon.setImageResource(icon); holder.nodeIcon.setVisibility(View.VISIBLE); } else holder.nodeIcon.setVisibility(View.INVISIBLE); //設(shè)置展開(kāi)折疊圖標(biāo) if(!node.isLeafOrNot()) { int expandIcon=node.getExpandOrFoldIcon(); if(expandIcon==-1) holder.expandOrFoldIcon.setVisibility(View.INVISIBLE); else { holder.expandOrFoldIcon.setImageResource(expandIcon); holder.expandOrFoldIcon.setVisibility(View.VISIBLE); } } else { holder.expandOrFoldIcon.setVisibility(View.INVISIBLE); } view.setPadding(node.getLevel()*35, 10, 10, 10); return view; } public class Holder { TextView description; ImageView nodeIcon; ImageView expandOrFoldIcon; } }
listview_item.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" > <ImageView android:id="@+id/imageview_nodeImage" android:layout_height="fill_parent" android:layout_width="wrap_content" android:layout_alignParentLeft="true" android:paddingRight="10dp"/> <TextView android:id="@+id/textview_nodeDescription" android:layout_height="fill_parent" android:layout_width="wrap_content" android:layout_toRightOf="@id/imageview_nodeImage" /> <ImageView android:id="@+id/imageview_expandedImage" android:layout_height="fill_parent" android:layout_width="wrap_content" android:layout_alignParentRight="true"/> </RelativeLayout>
實(shí)現(xiàn)效果:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android多級(jí)樹(shù)形列表控件
- Android實(shí)現(xiàn)樹(shù)形層級(jí)ListView
- Android提高之多級(jí)樹(shù)形菜單的實(shí)現(xiàn)方法
- 詳解js樹(shù)形控件—zTree使用總結(jié)
- jQuery樹(shù)形控件zTree使用小結(jié)
- Bootstrap樹(shù)形控件使用方法詳解
- js樹(shù)形控件腳本代碼
- 基于jQuery的樹(shù)控件實(shí)現(xiàn)代碼(asp.net+json)
- 選擇TreeView控件的樹(shù)狀數(shù)據(jù)節(jié)點(diǎn)的JS方法(jquery)
- Android樹(shù)形控件繪制方法
相關(guān)文章
Android平臺(tái)生成二維碼并實(shí)現(xiàn)掃描 & 識(shí)別功能
這篇文章主要介紹了Android平臺(tái)生成二維碼并實(shí)現(xiàn)掃描 & 識(shí)別功能的相關(guān)資料,需要的朋友可以參考下2016-06-06Android實(shí)現(xiàn)快速滾動(dòng)FastScrollView效果
這篇文章主要介紹了Android實(shí)現(xiàn)快速滾動(dòng)FastScrollView效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08Android 中API之Drawable資源詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了Android 中API之Drawable資源詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05Android 獲取傳感器列表整理及簡(jiǎn)單實(shí)例
這篇文章主要介紹了Android 獲取傳感器列表整理及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06android 手機(jī)截取長(zhǎng)屏實(shí)例代碼
本篇文章主要介紹了android 手機(jī)截取長(zhǎng)屏實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06解決Android Studio XML編輯界面不顯示下面的Text和Design選項(xiàng)卡
這篇文章主要介紹了解決Android Studio XML編輯界面不顯示下面的Text和Design選項(xiàng)卡,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03