web-dev-qa-db-ja.com

Android Treeview

ExpandableListView があることは知っていますが、最大2レベルしかサポートしていません。少なくとも最大5レベルまでの真のツリービュー垂直リストが必要です(多ければ多いほど良い)。

助言がありますか?

編集:

カスタムアダプターを使用して、アイテムレベルに基づいてパディングを設定する方法についての話を参照してください。

IDと親IDを持つオブジェクトの未ソートのArrayListがあり、この配列にもアイテムを動的に追加します。

誰も私がこれを行う方法の例を教えてもらえますか?

40
Daniel Sloof

数か月前に実装したので、自分の質問に答えます。

当社の実装 オープンソースプロジェクトで。

6
Daniel Sloof

同じ問題がありました。私の実装を確認できます AndroidTreeView

  • Nレベルツリー。

  • ノードのカスタムスタイル

  • 回転後の状態を保存

AndroidTreeView

17
bmelnychuk

当社もこのソリューションをオープンソース化しました。ライブラリとして利用できるため、非常に使いやすいです。 http://code.google.com/p/tree-view-list-Android/

enter image description here

14
Jarek Potiuk

私はそれを解決し、同様のスレッドで投稿しました: other thread

enter image description here

10
2red13

私自身はコーディングスキルがいくらか中程度なので、この問題に対するeasier解決策を見つけました。私の状況では、Windowsをテーマにしたツリービューが必要でした。アイデアをブレーンストーミングした後、ほとんどコーディングすることなく実装できました。

ここにトリックがあります:WebViewと埋め込みHTMLページを使用してカスタムツリービューを表示し、Androidの非常に便利なJavaScript通信インターフェイスを使用して選択とクリックを受信します: Android-erブログの概念実証の例

このパワーを使用して、Web上のJS/CSSコントロールスニペットの大規模なコレクションを利用できます。 テーマに応じたWindows7スタイルのjQuery TreeViewコントロール-jsTree

Androidそこに、幸せなコーディング!

4
Aaron Gillion

以下のリンクは非常に便利です。ツリー構造を2次元データ構造(通常はデータベーステーブル)に格納する別の方法について説明します。

このパラダイムは理解し、実装しやすいと思います。

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

これをAndroidで視覚化する方法は別の質問です。「パッド付き」リストアイテムのソリューションでは不十分な場合は、独自のウィジェットを最初から作成する可能性があります。

3
dbm

マルチレベルのexpandablelistが適切に行われれば、実際に機能し、見栄えが良くなると思います。 http://code.google.com/p/tree-view-list-Android/ の別の例を次に示します

enter image description here

3
dotsa

少なくとも電話サイズのデバイスについては、pjvに同意します。 ListViewで一度に1つの兄弟グループを表示するようにウィジェットを整理することをお勧めします。これは、ツリー内での位置を追跡する単一のアクティビティで実行できます。現在表示されているアイテムの親へのパスを示すパンくずリスト付きのヘッダーを表示できます。

マルチレベルのツリービューはタブレットデバイスに適している場合がありますが、電話には提案された5つのレベルをサポートするのに十分なスペースがありません(すべてが指に十分な大きさでなければなりません)。

それでも、ツリービューで設定されている場合は、ExpandableListViewのサブクラス化を見ないでください。これは、親インデックスと子インデックス(それぞれint)を単一のlongにパックすることにより内部的に動作します。この内部表現により、2レベルを超えることは事実上不可能です。

2
Ted Hopp
package com.expand.search;

import Android.app.ExpandableListActivity;
import Android.os.Bundle;
import Android.view.ContextMenu;
import Android.view.Gravity;
import Android.view.MenuItem;
import Android.view.View;
import Android.view.ViewGroup;
import Android.view.ContextMenu.ContextMenuInfo;
import Android.widget.AbsListView;
import Android.widget.BaseExpandableListAdapter;
import Android.widget.ExpandableListAdapter;
import Android.widget.ExpandableListView;
import Android.widget.TextView;
import Android.widget.Toast;
import Android.widget.ExpandableListView.ExpandableListContextMenuInfo;

   /** Demonstrates expandable lists using a custom {@link ExpandableListAdapter}
    * from {@link BaseExpandableListAdapter}.
   */
public class expands extends ExpandableListActivity {

ExpandableListAdapter mAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set up our adapter
    mAdapter = new MyExpandableListAdapter();
    setListAdapter(mAdapter);
    registerForContextMenu(getExpandableListView());
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    menu.setHeaderTitle("Sample menu");
    menu.add(0, 0, 0, R.string.expandable_list_sample_action);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) item.getMenuInfo();

    String title = ((TextView) info.targetView).getText().toString();

    int type = ExpandableListView.getPackedPositionType(info.packedPosition);
    if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
        int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition); 
        int childPos = ExpandableListView.getPackedPositionChild(info.packedPosition); 
        Toast.makeText(this, title + ": Child " + childPos + " clicked in group " + groupPos,   
                Toast.LENGTH_SHORT).show();
        return true;
    } else if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
        int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition); 
        Toast.makeText(this, title + ": Group " + groupPos + " clicked", Toast.LENGTH_SHORT).show();
        return true;
    }

    return false;
}

/** A simple adapter which maintains an ArrayList of photo resource Ids. 
 * Each photo is displayed as an image. This adapter supports clearing the
 * list of photos and adding a new photo.
 */
public class MyExpandableListAdapter extends BaseExpandableListAdapter {
    // Sample data set.  children[i] contains the children (String[]) for groups[i].
    private String[] groups = { "Category1", "Category2", "Category3", "Category4" };
    private String[][] children = {
            { "Charity1", "Charity2", "Charity3", "Charity4" },
            { "Charity5", "Charity6", "Charity7", "Charity8" },
            { "Charity9", "Charity10" },
            { "Charity11", "Charity12" }
    };

    public Object getChild(int groupPosition, int childPosition) {
        return children[groupPosition][childPosition];
    }

    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    public int getChildrenCount(int groupPosition) {
        return children[groupPosition].length;
    }

    public TextView getGenericView() {
        // Layout parameters for the ExpandableListView
        AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, 64);

        TextView textView = new TextView(expands.this);
        textView.setLayoutParams(lp);
        // Center the text vertically
        textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
        // Set the text starting position
        textView.setPadding(36, 0, 0, 0);
        return textView;
    }

    public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
            View convertView, ViewGroup parent) {
        TextView textView = getGenericView();
        textView.setText(getChild(groupPosition, childPosition).toString());
        return textView;
    }

    public Object getGroup(int groupPosition) {
        return groups[groupPosition];
    }

    public int getGroupCount() {
        return groups.length;
    }

    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
            ViewGroup parent) {
        TextView textView = getGenericView();
        textView.setText(getGroup(groupPosition).toString());
        return textView;
    }

    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

    public boolean hasStableIds() {
        return true;
    }
}

}

2
Arun

まず、データ構造を、それが何を含むのかをより代表的にすることから始めます。アイテムの配列があり、各子が独自のアイテムの配列を持つことができるため、それぞれが独自の配列を持つなど。アイテムの子を保持します。各子はそれ自体がクラスのインスタンスになるため、子も子を持つことができます。

プライベートクラスParentAndKids {オブジェクトの親。アレイキッズ; }

アダプターには、最上層を表すParentAndKidsオブジェクトの配列があります。どの親が展開されたかに基づいてリストアイテムを追加および削除します。

1
Ginger McMurray