2013-07-21 25 views
10

カテゴリの不明なサイズやレベルのリストからカテゴリツリーを作成しようとしています。だから私は2つ以上のレベルを含むことができる一般的な拡張可能なリストを作成しようとしています。 一般的なアイデアは、子を持つすべての子に、そのレイアウトに別のExpandableListViewを追加することです。問題は、第2レベルが開いていないことです。子供や何かの上にレンダリングされたように見えます。ここでは結果の一部のスクリーンショットです:Androidで複数レベルのExpandableListView

は、ここではenter image description here

を開く前に、そして、最初のオプションを開いた後のようになります方法は次のとおりです。(空のはずです)

enter image description here

そして今、第二1を開きます(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/ ...を持っているUの問題を解決した場合Uはあなたが私を助けてくださいurの問題を解決しました。 – 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属性を親のサイズも厳密に指定されていない場合(たとえば、親がScrollViewの場合はwrap_contentを指定できませんでしたが、これは任意の長さにすることができますが、ExpandableListViewの親のサイズが100ピクセルなど特定のサイズの場合はwrap_contentを使用できます。

それは "XMLで"と言われているので、コードに適用するかどうかはわかりません。彼らは同じ仕組みを使うと思うので、調べる価値があるかもしれません。私はあなたが親の最大サイズをどのように設定するかについてはわかりません。 1つのアイテムのサイズを測定し、子の数を掛けることができます。マージン/セパレータを考慮する必要があるので、単純ではないかもしれません。


これで解決しない場合は、独自のViewGroupを直接ロールする必要があります。最初から実装するのは難しいことではありません。ビューのリサイクルを利用することを忘れないでください(あなたの現在の方法ではやっていない)。

+0

お返事ありがとうございます!私はあなたが提案したことを試して、それがうまくいくかどうかをあなたに伝えます – UnTraDe

+0

私はLinearLayoutで提案したものをテストし、実際には重複したビューで私の問題を解決しました。しかし、今でも私はまだ2番目のレベル(Parent-> Children)以上のオープンはできませんExpandableListViewでいつものように動作しますが、私は子供の子供を開くことができません。あなたはこれをどのように解決するか考えていますか?前もって感謝します! – UnTraDe

+0

クリックが登録されているかどうかを確認するためにログに記録できますか?クリックを通過させるには、各項目で 'setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS)'を手動で呼び出す必要があります。リストビューは時々タッチの優先度について奇妙です。 – Geobits

2

私はExpandableListを使用していたし、各レベルで、私はgroupPositionchildPositionを持つために必要な同じような状況を持っていますが、マルチレベルExpandableListを使用していた、第二レベルのデータで正確なgroupPositionを取得することができませんでした。それで、私は別のアプローチを使用しました。私はプロジェクトで使用したデモリンクを与えました。

1)実際のデータをバインドする前に、このライブラリで親子関係を事前にバインドする必要があります。 2)Layoutの場合、一番上のレイアウトはLinearLayout.である必要があります。header.xmlgroups.xmlchilds.xmlのデモリンクを参照してください。

デモリンク:MultiLevelTreeView

感謝。

+0

もっと管理しやすいコードを持つ 'Expandable List'を探していて、ビューがクリックされたときに' groupPosition'と 'childPosition'を正確に返します。ありがとう、あなたは私の一日を作った。 –

+0

すばらしい図書館。最初のうちの1つは、3つ以上のレベルで動作しようとしました – Goldorak84

+0

@Abhanメソッド 'updateView'の' ThreeLevelAdapter'クラスにエラーメッセージ 'Headerは解決できないか、フィールドではありません。 'があります。 –

関連する問題