Android樹形控件的實現(xiàn)方法
在PC上我們已經(jīng)習(xí)慣了樹形控件,因為其可以清晰的展現(xiàn)各個節(jié)點之間的層次結(jié)果,但是在Android平臺上,系統(tǒng)并沒有提供這樣一個控件,而是只有ListView。不過通過改寫與ListView綁定的Adapter可以實現(xiàn)這樣一個效果。
一個ListView需要和一個Adapter綁定,用于管理數(shù)據(jù)。在這里以BaseAdapter為例,繼承Adapter需要重寫四個函數(shù),其中較為重要的是兩個:
1 public int getCount();//該函數(shù)返回ListView 的ListItem的條數(shù)
2 public View getView(int position, View view, ViewGroup arg2)//負(fù)責(zé)繪制每一個item。如果getCount()返回10,那么getView()就會被調(diào)用10次。
首先開發(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類用來在UI層中存儲一個節(jié)點的信息
*
*/
public class Node {
private Node parent=null;//父節(jié)點
private List<Node> children=null;
private String oid=null;//該節(jié)點的oid
private String name=null;//該節(jié)點信息的描述
private String value=null;//該節(jié)點的值
private boolean isLeaf=false;//是否為葉節(jié)點
private boolean isExpanded=false;//該節(jié)點是否展開
private int icon=-1;//該節(jié)點的圖標(biāo)對應(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é)點
public boolean isLeafOrNot()
{
return this.isLeaf;
}
//得到當(dāng)前節(jié)點所在的層數(shù),根為0層
public int getLevel()
{
return parent==null?0:parent.getLevel()+1;
}
//設(shè)置是否展開
public void setExpanded(boolean isExpanded)
{
this.isExpanded=isExpanded;
}
public boolean getExpanded()
{
return this.isExpanded;
}
//添加子節(jié)點
public void addChildNode(Node child)
{
if(this.children==null)
{
this.children=new ArrayList<Node>();
}
this.children.add(child);
}
//清空子節(jié)點
public void clearChildren()
{
if(!this.children.equals(null))
{
this.children.clear();
}
}
//是否為根節(jié)點
public boolean isRoot()
{
return this.parent.equals(null)?true:false;
}
//設(shè)置展開圖標(biāo)
public void setExpandIcon(int expand)
{
this.iconForExpanding=expand;
}
//設(shè)置折疊圖標(biāo)
public void setFoldIcon(int fold)
{
this.iconForFolding=fold;
}
//得到展開或折疊圖標(biāo)
public int getExpandOrFoldIcon()
{
if(this.isExpanded==true)
return this.iconForExpanding;
else
return this.iconForFolding;
}
//得到子樹
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é)點
private List<Node> nodeListToShow=new ArrayList<Node>();//要展現(xiàn)的節(jié)點
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得到某一個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被點擊的響應(yīng)事件
public Node OnListItemClick(int position)
{
Node node=this.nodeListToShow.get(position);
if(node.isLeafOrNot())
{
//處理snmp代碼
Toast.makeText(this.context, "該節(jié)點為子節(jié)點", 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);
}
//繪制一個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è)置展開折疊圖標(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>
實現(xiàn)效果:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android listview與adapter詳解及實例代碼
本文主要介紹Android listview與adapter的知識詳解,這里整理了相關(guān)資料及實現(xiàn)代碼和實現(xiàn)效果圖,有興趣的小伙伴可以參考下2016-09-09
android實現(xiàn)okHttp的get和post請求的簡單封裝與使用
這篇文章主要介紹了android實現(xiàn)okHttp的get和post請求的簡單封裝與使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
Android使用Walle實現(xiàn)多渠道打包功能的實現(xiàn)示例
這篇文章主要介紹了Android使用Walle實現(xiàn)多渠道打包功能的實現(xiàn)示例,幫助大家更好的理解和學(xué)習(xí)使用Android開發(fā),感興趣的朋友可以了解下2021-04-04
java,Android:在eclipse中的快捷鍵(經(jīng)典收藏)
下面的快捷鍵是常用的,本人就本身喜好且常用的收拾一下,現(xiàn)在曬出來與大家分享,感興趣的朋友可以了解小哦2013-01-01
Android安卓中循環(huán)錄像并檢測內(nèi)存卡容量
這篇文章主要介紹了Android安卓中循環(huán)錄像并檢測內(nèi)存卡容量,當(dāng)內(nèi)存卡空間已滿時,本文還實現(xiàn)自動刪除視頻列表里面的第一個文件,需要的朋友可以參考下2015-06-06
Android ExpandableListView單選以及多選實現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Android ExpandableListView單選以及多選的實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-06-06

