web-dev-qa-db-ja.com

Android:Navigation Drawer内の2つ以上のExpandableListView

どうすればこのようなことができますか?

enter image description here

ナビゲーションドロワー内の2つの拡張可能なリストビュー。私はそれを私のxml内に追加しようとしましたが、運がありませんでした。スクロールバーが1つしかないビューが欲しいのですが、方法がわかりません。

これは私のナビゲーションドロワーレイアウトです。

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:background="@color/Bianco"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <LinearLayout
        Android:layout_width="match_parent"
        Android:orientation="vertical"
        Android:layout_marginLeft="16dp"
        Android:layout_marginTop="8dp"
        Android:layout_marginBottom="8dp"
        Android:layout_marginRight="16dp"
        Android:layout_height="wrap_content">

        <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:textAppearance="?android:attr/textAppearanceLarge"
            Android:text="@string/tvHomeActions"
            Android:id="@+id/textView" />

        <ExpandableListView
            Android:id="@+id/elvHome"
            Android:layout_width="match_parent"
            Android:layout_marginTop="4dp"
            Android:layout_height="300dp" />

        <TextView
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:textAppearance="?android:attr/textAppearanceLarge"
            Android:text="@string/tvHomeNavigations"
            Android:layout_marginTop="16dp"
            Android:id="@+id/textView2" />

        <ExpandableListView
            Android:id="@+id/elvNavigateTo"
            Android:layout_width="match_parent"
            Android:layout_height="200dp"
            Android:layout_marginTop="4dp"  />

    </LinearLayout>

</ScrollView>

編集: Gmailアプリで引き出しのようなものを作成したい

13
crc_error

enter image description here

やっと手に入れた!これは、セクションタイトルを持つExpandableListViewを取得するために作成したコードです。これで、タイトル、グループ、および子供用の3つのxmlカスタムレイアウトを簡単に作成できます。

それは私にとってはうまくいきますが、メモリの使用状況や速度などを最適化するためにコードの改善を受け入れます。

// ---------------------------------------------------------------------------------------------
// NAVIGATION DRAWER SIDE FRAGMENT
// ---------------------------------------------------------------------------------------------

private ExpandableListView mDrawerListView;
private List<Elemento> mainActions = new ArrayList<>();
private HashMap<Integer, List<String>> childActions = new HashMap<>();

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.frg_navigation_drawer, container, false);

    assert v != null;

    mDrawerListView = (ExpandableListView) v.findViewById(R.id.elvHome);
    mDrawerListView.setGroupIndicator(null);

    // add first title
    mainActions.add(new TitoloGruppo("Good guys"));                     // 0
    mainActions.add(new Azione("Admiral Ackbar", "Dagobah System"));    // 1
    mainActions.add(new Azione("Han Solo", "Millenium Falcon"));        // 2
    mainActions.add(new Azione("Yoda", "Dagobah System"));              // 3
    // add second title
    mainActions.add(new TitoloGruppo("Bad guys"));                      // 4
    mainActions.add(new Azione("Emperor", "Death star 2"));             // 5
    mainActions.add(new Azione("Jabba", "Tatooine"));                   // 6
    mainActions.add(new Azione("Grand Moff Tarkin", "Death star 1"));   // 7

    // Adding child quotes to Ackbar
    List<String> mainSubFive = new ArrayList<>();
    mainSubFive.add("It's a trap!");

    // Adding child quotes to Yoda
    List<String> mainSubThree = new ArrayList<>();
    mainSubThree.add("Do or do not; there is no try.");
    mainSubThree.add("There is … another … Sky … walker.…");
    mainSubThree.add("When 900 years old you reach, look as good you will not ehh.");

    childActions.put(0, new ArrayList<String>());
    childActions.put(1, mainSubFive);
    childActions.put(2, new ArrayList<String>());
    childActions.put(3, mainSubThree);
    childActions.put(4, new ArrayList<String>());
    childActions.put(5, new ArrayList<String>());
    childActions.put(6, new ArrayList<String>());

    mDrawerListView.setAdapter(new ExpandableAdapter(getActivity(), mainActions, childActions));
    mDrawerListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
        @Override
        public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
            List<String> list = childActions.get(groupPosition);
            if(list.size() > 0)
                return false;
            else
                Toast.makeText(getActivity(), ""+ ((Azione) mainActions.get(groupPosition)).getSubtitle(), Toast.LENGTH_LONG).show();
            return false;
        }
    });

    mDrawerListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
        @Override
        public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
            List<String> list = childActions.get(groupPosition);

            Toast.makeText(getActivity(), "" + list.get(childPosition).toString(), Toast.LENGTH_LONG).show();
            return false;
        }
    });
    return v;
}


// ---------------------------------------------------------------------------------------------
// INTERNAL CLASS
// ---------------------------------------------------------------------------------------------

protected class ExpandableAdapter extends BaseExpandableListAdapter {

    private Context context;
    private List<Elemento> mainElements;
    private HashMap<Integer, List<String>> childElements;
    private LayoutInflater vi;

    public ExpandableAdapter(Context context, List<Elemento> mainElements, HashMap<Integer, List<String>> childElements) {
        this.context = context;
        this.mainElements = mainElements;
        this.childElements = childElements;
        vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getGroupCount() {
        return this.mainElements.size();
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        if(this.childElements.get(groupPosition) == null)
            return 0;
        return this.childElements.get(groupPosition).size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return this.mainElements.get(groupPosition);
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return this.childElements.get(groupPosition).get(childPosition);
    }

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

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

    @Override
    public boolean hasStableIds() {
        return false;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        View v = convertView;

        final Elemento i = mainElements.get(groupPosition);
        if (i != null) {
            if(i.isGroupSection()){
                final TitoloGruppo si = (TitoloGruppo)i;
                v = vi.inflate(Android.R.layout.simple_list_item_1, null);
                v.setOnClickListener(null);
                v.setOnLongClickListener(null);
                v.setLongClickable(false);
                final TextView sectionView = (TextView) v.findViewById(Android.R.id.text1);
                sectionView.setTextColor(Color.parseColor("#FFC800"));
                sectionView.setText(si.getTitle());
            }else if(i.isAction()){
                Azione ei = (Azione)i;
                v = vi.inflate(Android.R.layout.simple_list_item_2, null);
                final TextView title = (TextView)v.findViewById(Android.R.id.text1);
                final TextView subtitle = (TextView)v.findViewById(Android.R.id.text2);

                if (title != null)
                    title.setText(ei.title);
                if(subtitle != null)
                    subtitle.setText("count: " + getChildrenCount(groupPosition));
            }
        }
        return v;
    }

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

        final String childText = (String) getChild(groupPosition, childPosition);

        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this.context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(Android.R.layout.simple_list_item_1, null);
        }

        TextView txtListChild = (TextView) convertView.findViewById(Android.R.id.text1);
        txtListChild.setText(childText);
        return convertView;
    }

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

    public class TitoloGruppo implements Elemento {

    private final String titolo;

    public TitoloGruppo(String titolo) {
        this.titolo = titolo;
    }

    public String getTitle(){
        return titolo;
    }

    @Override
    public boolean isGroupSection() {
        return true;
    }

    @Override
    public boolean isAction() {
        return false;
    }
}

protected interface Elemento {
    public boolean isGroupSection();
    public boolean isAction();
}

protected class Azione implements Elemento {
    public final String title;
    public final String subtitle;

    public Azione(String title, String subtitle) {
        this.title = title;
        this.subtitle = subtitle;
    }

    public String getTitle() {
        return this.title;
    }

    public String getSubtitle() {
        return this.subtitle;
    }

    @Override
    public boolean isGroupSection() {
        return false;
    }

    @Override
    public boolean isAction() {
        return true;
    }
}

Ps。皆さん、ありがとうございました

17
crc_error

[〜#〜] fyi [〜#〜]qsnに表示したスクリーンショットにも、ピン留めまたはセクション化されたリストビューがあります。

ナビゲーションドロワーのExpandableListView:

enter image description here

ナビゲーションドロワーのExpandableListViewにこのコード DrawerLayoutTest を使用します。

更新:これはまさにあなたが探しているものです、これを試してみてください michenux navigation-drawerGit

ロジック:

1> ExpandableListView + michenuxナビゲーションドロワードロワーをデザインと展開可能なリストビューに使用し、その内の「3」アイテムの数jgilfeltのAndroid-viewbadger libを使用します。

2>展開可能なリストビューのドロップダウンアイコンを有効にしないようにするには、リストビューのgetview(..)で遊んで、アイテムに子がない(配列またはarraylistがnull /空である)かを確認し、表示を非表示にします。バッジャー(ドロップダウンアイコン/バッジ)であるか、各アイテムの値に応じてリストビューアイテムのレイアウトを変更する例:リストの行に展開可能な子が含まれ、ビューバッジで異なるレイアウトをロードする!

クレジット:Michenaud、Jgilfelt

8
LOG_TAG