2013-07-21 51 views
10

我試圖從給定的未知大小或級別的類別列表中創建類別樹。所以我試圖創建一個可以包含2+數量級別的通用可擴展列表。 一般的想法是爲每個有孩子的孩子添加另一個ExpandableListView。問題在於第二層無法打開,看起來像是將它渲染到了孩子身上。下面是結果的一些屏幕截圖:Android中的多級ExpandableListView

這裏是它的外觀像打開enter image description here

之前開放的第一個選項後(這應該是空的)

enter image description here

現在打開第二個:(有4個孩子,其中一個有自己的孩子)

enter image description here

正如你所看到的第三個選項看起來像是被渲染的其他選項或者在它的東西,點擊打開它後:

enter image description here

這是什麼都不做,除了改變箭頭的狀態。至少它試圖打開它...

下面的代碼:

CatAdapter.java:(延伸BaseExpandableListAdapter) http://pastebin.com/6yUTkMbJ

Category.java: http://pastebin.com/E7yWwpna

catitem.xml: http://pastebin.com/G5MPT3Ua

用法: http://pastebin.com/Wk0FqJhn

對不起,我試圖儘可能清楚。

在此先感謝!對不起,我的英語不好!

編輯:

我最終作出了這個任務,謝謝大家對你的答案自定義視圖!

+0

嗨,你介意分享一下你設法制作或者可能分享的一些自定義視圖嗎? –

+1

你解決了你的問題我也有同樣的問題stackoverflow.com/questions/18765638/...如果你已經解決了你的問題,請幫助我。 – Cropper

+0

我設法解決了創建自定義視圖並實現自定義OnDraw()的問題。 – UnTraDe

回答

6

我相信這個問題是在你的getChildView()方法:

public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 

      convertView = inflater.inflate(R.layout.catitem, parent, false); 
      TextView textView_catName = (TextView)convertView.findViewById(R.id.textView_catName); 
      Category current = categories.get(groupPosition).childs.get(childPosition); 
      textView_catName.setText(groupPosition + " , " + childPosition); 

      if(current.childs.size() > 0) { 
        ExpandableListView elv = new ExpandableListView(context); 
        elv.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.WRAP_CONTENT, AbsListView.LayoutParams.WRAP_CONTENT)); 
        elv.setAdapter(new CatAdapter(context, current.childs)); 
        ((ViewGroup)convertView).addView(elv); 
      } 

      return convertView; 
    } 

當你遇到一個「擴張」孩子,你還在膨脹R.layout.catitem並添加新的elv它。由於catitemRelativeLayout,您不需要添加任何參數以進行對齊,因此每個視圖都放置在左上角,覆蓋其他任何地方。

您可能需要嘗試更改R.layout.catitem以垂直LinearLayout作爲其根。這應該防止他們重疊孩子的頭銜,但我不能保證孩子的孩子不會重疊。這是一個簡單的改變,但值得一試。


此外,從文檔的ExpandableListView

注意:您不能使用了Android的價值WRAP_CONTENT:如果父母的大小也沒有嚴格規定在XML ExpandableListView的layout_height屬性(例如,如果父母是滾動型,你可以不指定WRAP_CONTENT,因爲它也可以是任何長度,但你可以使用WRAP_CONTENT如果ExpandableListView家長有一個特定的大小,如100個像素。

這表示「在XML中」,所以我不確定它是否意味着適用於代碼。在我看來,他們會使用相同的機制,因此可能值得研究。我不確定你會如何去設置父級的最大大小。您可能能夠測量一個項目的大小,並乘以子項的數量。你必須考慮邊界/分隔符,所以它可能並不簡單。


如果這不起作用,您可能需要直接滾動您自己的ViewGroup。從頭開始實現它不應該太困難,只是不要忘記嘗試利用視圖回收(目前的方法無論如何)。

+0

非常感謝您的回答!我會嘗試你的建議,並讓它如果工作。 – UnTraDe

+0

好吧,我測試了你對LinearLayout的建議,它確實解決了重疊視圖的問題。但現在我仍然無法打開比第二級(父 - >子)進一步在ExpandableListView中正常工作,但我無法打開孩子的孩子。你有什麼想法如何解決這個問題?提前致謝! – UnTraDe

+0

你能否登錄查看點擊是否被註冊?您可能需要在每個項目上手動調用'setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS)'以允許點擊通過。有時候ListView對於觸摸優先級有點奇怪。 – Geobits

2

我有,我不得不使用ExpandableList同樣的情況,並在每個級別我需要有groupPositionchildPosition但採用多級ExpandableList,這是不可能得到的第二級數據準確groupPosition。所以,我用另一種方法。我已經給出了一個我在項目中使用的演示鏈接。

1)在這個庫中,您需要在綁定實際數據之前預先綁定父子關係。 2)在您的Layout中,最頂端的佈局必須是LinearLayout.請參閱header.xml,groups.xmlchilds.xml演示鏈接。

演示鏈接:MultiLevelTreeView

感謝。

+0

我一直在尋找'Expandable List',它具有更易於管理的代碼,並在點擊視圖時準確地給出了所有'groupPosition'和'childPosition'。謝謝,你做了我的一天。 – 2013-07-26 15:46:27

+0

偉大的圖書館。我嘗試的第一個嘗試超過三個級別 – Goldorak84

+0

@Abhan錯誤消息'方法'updateView'中的'ThreeLevelAdapter'類中存在'Header無法解析或不是字段'的錯誤消息。 –