日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android二级菜单ui,Android UI 之实现多级树形列表TreeView示例

發布時間:2024/10/6 Android 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android二级菜单ui,Android UI 之实现多级树形列表TreeView示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

所謂TreeView就是在Windows中常見的多級列表樹,在Android中系統只默認提供了ListView和ExpandableListView兩種列表,最多只支持到二級列表的實現,所以如果想要實現三級和更多層次的列表,就需要我們自己來做一些處理了。

其實這個效果很久以前就有人想辦法實現了,但是實現的效果有一些問題,我的實現思路主要也是來自于網絡,但是在其基礎上修正了邏輯上的一些錯誤,做了一些優化。

先來看一下效果:

然后大體說一下思路:

其實這里實現的多級列表只是一個視覺效果,我們看到的分級效果是由于每行的縮進不同造成的。比如在上面的效果中,山東省和廣東省是級別最高的層次,山東省下的青島市作為山東省的子項,我們增加他的左縮進,這樣看起來就有了層次感了。其他的層次也是同理。

也就是說,我們只用了一個ListView,工作的重點就在于不斷變化ListView顯示的數據,根據用戶的操作,將數據修改為用戶想要看到的數據內容,并根據每個數據項的不同,在顯示效果上做不同的縮進處理,最終呈現出一個TreeView的效果。

具體的實現思路參考下面的項目結構和具體代碼:

Element.Java:

package com.example.androidtreeviewdemo.treeview;

/**

* Element類

* @author carrey

*

*/

public class Element {

/** 文字內容 */

private String contentText;

/** 在tree中的層級 */

private int level;

/** 元素的id */

private int id;

/** 父元素的id */

private int parendId;

/** 是否有子元素 */

private boolean hasChildren;

/** item是否展開 */

private boolean isExpanded;

/** 表示該節點沒有父元素,也就是level為0的節點 */

public static final int NO_PARENT = -1;

/** 表示該元素位于最頂層的層級 */

public static final int TOP_LEVEL = 0;

public Element(String contentText, int level, int id, int parendId,

boolean hasChildren, boolean isExpanded) {

super();

this.contentText = contentText;

this.level = level;

this.id = id;

this.parendId = parendId;

this.hasChildren = hasChildren;

this.isExpanded = isExpanded;

}

public boolean isExpanded() {

return isExpanded;

}

public void setExpanded(boolean isExpanded) {

this.isExpanded = isExpanded;

}

public String getContentText() {

return contentText;

}

public void setContentText(String contentText) {

this.contentText = contentText;

}

public int getLevel() {

return level;

}

public void setLevel(int level) {

this.level = level;

}

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public int getParendId() {

return parendId;

}

public void setParendId(int parendId) {

this.parendId = parendId;

}

public boolean isHasChildren() {

return hasChildren;

}

public void setHasChildren(boolean hasChildren) {

this.hasChildren = hasChildren;

}

}

TreeViewAdapter.java:

package com.example.androidtreeviewdemo.treeview;

import java.util.ArrayList;

import com.example.androidtreeviewdemo.R;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.ImageView;

import android.widget.TextView;

/**

* TreeViewAdapter

* @author carrey

*

*/

public class TreeViewAdapter extends BaseAdapter {

/** 元素數據源 */

private ArrayList elementsData;

/** 樹中元素 */

private ArrayList elements;

/** LayoutInflater */

private LayoutInflater inflater;

/** item的行首縮進基數 */

private int indentionBase;

public TreeViewAdapter(ArrayList elements, ArrayList elementsData, LayoutInflater inflater) {

this.elements = elements;

this.elementsData = elementsData;

this.inflater = inflater;

indentionBase = 50;

}

public ArrayList getElements() {

return elements;

}

public ArrayList getElementsData() {

return elementsData;

}

@Override

public int getCount() {

return elements.size();

}

@Override

public Object getItem(int position) {

return elements.get(position);

}

@Override

public long getItemId(int position) {

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder = null;

if (convertView == null) {

holder = new ViewHolder();

convertView = inflater.inflate(R.layout.treeview_item, null);

holder.disclosureImg = (ImageView) convertView.findViewById(R.id.disclosureImg);

holder.contentText = (TextView) convertView.findViewById(R.id.contentText);

convertView.setTag(holder);

} else {

holder = (ViewHolder) convertView.getTag();

}

Element element = elements.get(position);

int level = element.getLevel();

holder.disclosureImg.setPadding(

indentionBase * (level + 1),

holder.disclosureImg.getPaddingTop(),

holder.disclosureImg.getPaddingRight(),

holder.disclosureImg.getPaddingBottom());

holder.contentText.setText(element.getContentText());

if (element.isHasChildren() && !element.isExpanded()) {

holder.disclosureImg.setImageResource(R.drawable.close);

//這里要主動設置一下icon可見,因為convertView有可能是重用了"設置了不可見"的view,下同。

holder.disclosureImg.setVisibility(View.VISIBLE);

} else if (element.isHasChildren() && element.isExpanded()) {

holder.disclosureImg.setImageResource(R.drawable.open);

holder.disclosureImg.setVisibility(View.VISIBLE);

} else if (!element.isHasChildren()) {

holder.disclosureImg.setImageResource(R.drawable.close);

holder.disclosureImg.setVisibility(View.INVISIBLE);

}

return convertView;

}

/**

* 優化Holder

* @author carrey

*

*/

static class ViewHolder{

ImageView disclosureImg;

TextView contentText;

}

}

TreeViewItemClickListener.java:

package com.example.androidtreeviewdemo.treeview;

import java.util.ArrayList;

import android.view.View;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener;

/**

* TreeView item點擊事件

* @author carrey

*

*/

public class TreeViewItemClickListener implements OnItemClickListener {

/** adapter */

private TreeViewAdapter treeViewAdapter;

public TreeViewItemClickListener(TreeViewAdapter treeViewAdapter) {

this.treeViewAdapter = treeViewAdapter;

}

@Override

public void onItemClick(AdapterView> parent, View view, int position,

long id) {

//點擊的item代表的元素

Element element = (Element) treeViewAdapter.getItem(position);

//樹中的元素

ArrayList elements = treeViewAdapter.getElements();

//元素的數據源

ArrayList elementsData = treeViewAdapter.getElementsData();

//點擊沒有子項的item直接返回

if (!element.isHasChildren()) {

return;

}

if (element.isExpanded()) {

element.setExpanded(false);

//刪除節點內部對應子節點數據,包括子節點的子節點...

ArrayList elementsToDel = new ArrayList();

for (int i = position + 1; i < elements.size(); i++) {

if (element.getLevel() >= elements.get(i).getLevel())

break;

elementsToDel.add(elements.get(i));

}

elements.removeAll(elementsToDel);

treeViewAdapter.notifyDataSetChanged();

} else {

element.setExpanded(true);

//從數據源中提取子節點數據添加進樹,注意這里只是添加了下一級子節點,為了簡化邏輯

int i = 1;//注意這里的計數器放在for外面才能保證計數有效

for (Element e : elementsData) {

if (e.getParendId() == element.getId()) {

e.setExpanded(false);

elements.add(position + i, e);

i ++;

}

}

treeViewAdapter.notifyDataSetChanged();

}

}

}

MainActivity.java:

package com.example.androidtreeviewdemo;

import java.util.ArrayList;

import com.example.androidtreeviewdemo.treeview.Element;

import com.example.androidtreeviewdemo.treeview.TreeViewAdapter;

import com.example.androidtreeviewdemo.treeview.TreeViewItemClickListener;

import android.os.Bundle;

import android.app.Activity;

import android.content.Context;

import android.view.LayoutInflater;

import android.view.Menu;

import android.widget.ListView;

public class MainActivity extends Activity {

/** 樹中的元素集合 */

private ArrayList elements;

/** 數據源元素集合 */

private ArrayList elementsData;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

init();

ListView treeview = (ListView) findViewById(R.id.treeview);

TreeViewAdapter treeViewAdapter = new TreeViewAdapter(

elements, elementsData, inflater);

TreeViewItemClickListener treeViewItemClickListener = new TreeViewItemClickListener(treeViewAdapter);

treeview.setAdapter(treeViewAdapter);

treeview.setOnItemClickListener(treeViewItemClickListener);

}

private void init() {

elements = new ArrayList();

elementsData = new ArrayList();

//添加節點 -- 節點名稱,節點level,節點id,父節點id,是否有子節點,是否展開

//添加最外層節點

Element e1 = new Element("山東省", Element.TOP_LEVEL, 0, Element.NO_PARENT, true, false);

//添加第一層節點

Element e2 = new Element("青島市", Element.TOP_LEVEL + 1, 1, e1.getId(), true, false);

//添加第二層節點

Element e3 = new Element("市南區", Element.TOP_LEVEL + 2, 2, e2.getId(), true, false);

//添加第三層節點

Element e4 = new Element("香港中路", Element.TOP_LEVEL + 3, 3, e3.getId(), false, false);

//添加第一層節點

Element e5 = new Element("煙臺市", Element.TOP_LEVEL + 1, 4, e1.getId(), true, false);

//添加第二層節點

Element e6 = new Element("芝罘區", Element.TOP_LEVEL + 2, 5, e5.getId(), true, false);

//添加第三層節點

Element e7 = new Element("鳳凰臺街道", Element.TOP_LEVEL + 3, 6, e6.getId(), false, false);

//添加第一層節點

Element e8 = new Element("威海市", Element.TOP_LEVEL + 1, 7, e1.getId(), false, false);

//添加最外層節點

Element e9 = new Element("廣東省", Element.TOP_LEVEL, 8, Element.NO_PARENT, true, false);

//添加第一層節點

Element e10 = new Element("深圳市", Element.TOP_LEVEL + 1, 9, e9.getId(), true, false);

//添加第二層節點

Element e11 = new Element("南山區", Element.TOP_LEVEL + 2, 10, e10.getId(), true, false);

//添加第三層節點

Element e12 = new Element("深南大道", Element.TOP_LEVEL + 3, 11, e11.getId(), true, false);

//添加第四層節點

Element e13 = new Element("10000號", Element.TOP_LEVEL + 4, 12, e12.getId(), false, false);

//添加初始樹元素

elements.add(e1);

elements.add(e9);

//創建數據源

elementsData.add(e1);

elementsData.add(e2);

elementsData.add(e3);

elementsData.add(e4);

elementsData.add(e5);

elementsData.add(e6);

elementsData.add(e7);

elementsData.add(e8);

elementsData.add(e9);

elementsData.add(e10);

elementsData.add(e11);

elementsData.add(e12);

elementsData.add(e13);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.activity_main, menu);

return true;

}

}

treeview_item.xml:

android:layout_width="match_parent"

android:layout_height="match_parent" >

android:id="@+id/disclosureImg"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerVertical="true"

android:layout_alignParentLeft="true"/>

android:id="@+id/contentText"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerVertical="true"

android:layout_toRightOf="@id/disclosureImg"/>

activity_main.xml:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context=".MainActivity" >

android:id="@+id/treeview"

android:layout_width="match_parent"

android:layout_height="match_parent"/>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的android二级菜单ui,Android UI 之实现多级树形列表TreeView示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲欧美日本国产 | 亚洲一区精品视频在线观看 | 日韩一区二区av | 亚洲欧美在线一区 | 国产精品一区二区三区免费看 | 欧美激情一区二区三级高清视频 | 高中男男gay互囗交观看 | 亚洲天堂中文字幕在线观看 | 成人免费视频网站在线观看 | 国产成人无码一区二区在线观看 | 亚洲精品一区 | 高潮一区二区三区 | 九色视频网 | 91久久精品视频 | 精品久久久久久亚洲精品 | 日本a级片在线播放 | 色99在线 | 1000部啪啪未满十八勿入超污 | 深夜福利免费在线观看 | 色老久久 | 三级黄色在线 | 亚洲一区二区福利视频 | 久久精品久久精品久久 | 男人天堂综合网 | av手机网站| www欧美在线 | 精品偷拍网 | 色婷婷色婷婷 | 色干综合 | 小早川怜子久久精品中文字幕 | 国产99久久久国产精品免费看 | 日韩av资源 | 黄wwwww| caopor在线视频 | 黄色一级片国产 | 欧美日韩一区二区三区在线视频 | 亚洲最大av在线 | 成人av电影在线播放 | 婷婷激情网站 | 成年黄色网| 99精品久久久久久 | 可以看黄色的网站 | jizz久久| 综合色爱 | 欧美性猛交富婆 | 国产免费高清av | 午夜成人免费影院 | 欧美女同在线 | 免费av观看网站 | 献给魔王伊伏洛基亚吧动漫在线观看 | 日韩国产欧美在线观看 | 少妇精品视频 | 亚洲人成无码网站久久99热国产 | 免费中文字幕在线观看 | 欧美另类z0z变态 | 国精产品一区一区三区免费视频 | 成人在线观看国产 | 无码人妻一区二区三区av | 草草影院国产第一页 | 自拍偷拍亚洲欧美 | 精品国产污污免费网站入口 | 日韩精品短片 | 亚洲私人网站 | 国产精品久久毛片av大全日韩 | www.嫩草.com | 中国美女一级黄色片 | 欧日韩一区二区三区 | 在线观看av一区二区 | 天天天天射 | 国产视频麻豆 | 国产www精品| 黑人玩弄人妻一区二区三区四 | av资源中文在线 | 成人在线三级 | 欧美 日韩 国产 高清 | 成人综合影院 | 亚洲天堂资源在线 | 操色网 | 日噜| 在线成人 | 69日本xxxxxxxxx30 在线波多野结衣 | 人人爽人人爽人人 | 在线精品视频一区 | 久久综合综合 | 丝袜一级片| 国产视频播放 | 射黄视频| 99久久久无码国产精品免费麻豆 | 成人看片免费 | 九九热在线精品视频 | 亚洲中文字幕无码爆乳av | 日韩 国产 欧美 | 三度诱惑免费版电影在线观看 | 欧美视频一区二区在线 | 亚洲国产视频一区二区三区 | 国产福利视频导航 | 黄色污污视频软件 | 男人网站在线观看 | 国产女人叫床高潮大片免费 |