. Android ExpandableListView Beispiel Tutorial

Willkommen zum Android ExpandableListView Beispiel Tutorial. In diesem Tutorial werden wir eine ExpandableListView implementieren, die verwendet wird, um Listen-Daten nach Kategorien zu gruppieren. Es handelt sich um eine Art Menü und Untermenüs in einer Android ListView.

Android ExpandableListView

Android ExpandableListView ist eine Ansicht, die Elemente in einer vertikal scrollenden zweistufigen Liste anzeigt. Sie unterscheidet sich von einer ListView dadurch, dass sie zwei Ebenen ermöglicht, die Gruppen sind, die durch Berühren zur Anzeige leicht erweitert und zusammengeklappt werden können, sowie ihre jeweiligen Kinder-Elemente. ExpandableListViewAdapter in Android lädt die Daten in die mit dieser Ansicht verbundenen Elemente. Hier sind einige wichtige Methoden, die von dieser Klasse verwendet werden:

  • setChildIndicator(Drawable): Dies wird verwendet, um einen Indikator neben jedem Element anzuzeigen, der den aktuellen Zustand repräsentiert. Wenn das Kind das letzte Kind für eine Gruppe ist, wird der Zustand state_last gesetzt.
  • setGroupIndicator(Drawable): Ein Indikator wird neben der Gruppe gezeichnet, der ihren Zustand repräsentiert, d.h. erweitert oder zusammengeklappt. Wenn die Gruppe leer ist, wird der Zustand state_empty gesetzt. Wenn die Gruppe erweitert ist, wird der Zustand state_expanded gesetzt.
  • getGroupView(): Es liefert eine Ansicht für den Listen-Gruppenheader.
  • getChildView(): Es gibt die Ansicht für das Listenunterelement zurück

Die bemerkenswerten Schnittstellen, die von dieser Klasse implementiert werden, sind unten angegeben:

  • ExpandableListView.OnChildClickListener: Diese Methode wird überschrieben, um die Rückrufmethode zu implementieren, die aufgerufen wird, wenn ein Unterelement in der erweiterten Liste angeklickt wird
  • ExpandableListView.OnGroupClickListener: Diese Methode wird überschrieben, um die Rückrufmethode zu implementieren, die aufgerufen wird, wenn der Kopfzeilentitel einer Gruppe in der erweiterten Liste angeklickt wird
  • ExpandableListView.OnGroupCollapseListener: Es wird verwendet, um zu benachrichtigen, wenn eine Gruppe zusammengeklappt wird
  • ExpandableListView.OnGroupExpandListener: Es wird verwendet, um zu benachrichtigen, wenn eine Gruppe erweitert wird

Android ExpandableListView Projektstruktur

Dieses Projekt besteht aus drei Klassen.

  • A MainActivity that shows the layout with the ExpandableListView
  • Ein ExpandableListDataPump, das eine zufällige Daten in einer Liste darstellt und die Daten der Unterelemente den entsprechenden Gruppenüberschriften mit Hilfe einer HashMap zuordnet.
  • A CustomExpandableListAdapter which provides the MainActivity with the data from the ExpandableListDataPump class/li>

Android ExpandableListView Code

Das Layout activity_main.xml besteht aus einem ExpandableListView in einem RelativeLayout, wie unten gezeigt: activity_main.xml

<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <ExpandableListView
        android:id="@+id/expandableListView"
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:indicatorLeft="?android:attr/expandableListPreferredItemIndicatorLeft"
        android:divider="@android:color/darker_gray"
        android:dividerHeight="0.5dp" />

</RelativeLayout>

Der android:indicatorLeft ist die linke Begrenzung für den Anzeiger eines Elements. Hinweis: Wir können den Wert wrap_content nicht für das Attribut android:layout_height des ExpandableListView in XML verwenden, es sei denn, die Größe des übergeordneten Elements ist genau angegeben. Das Layout des Gruppenheaders jeder einzelnen Liste ist unten angegeben: list_group.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/listTitle"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="?android:attr/expandableListPreferredItemPaddingLeft"
        android:textColor="@android:color/black"
        android:paddingTop="10dp"
        android:paddingBottom="10dp" />
</LinearLayout>

Die Layout-Zeile der Unterelemente ist unten angegeben: list_item.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
        android:id="@+id/expandedListItem"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="?android:attr/expandableListPreferredChildPaddingLeft"
        android:paddingTop="10dp"
        android:paddingBottom="10dp" />
</LinearLayout>

Die Klasse ExpandableListDataPump ist wie folgt definiert:

package com.journaldev.expandablelistview;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class ExpandableListDataPump {
    public static HashMap<String, List<String>> getData() {
        HashMap<String, List<String>> expandableListDetail = new HashMap<String, List<String>>();

        List<String> cricket = new ArrayList<String>();
        cricket.add("India");
        cricket.add("Pakistan");
        cricket.add("Australia");
        cricket.add("England");
        cricket.add("South Africa");

        List<String> football = new ArrayList<String>();
        football.add("Brazil");
        football.add("Spain");
        football.add("Germany");
        football.add("Netherlands");
        football.add("Italy");

        List<String> basketball = new ArrayList<String>();
        basketball.add("United States");
        basketball.add("Spain");
        basketball.add("Argentina");
        basketball.add("France");
        basketball.add("Russia");

        expandableListDetail.put("CRICKET TEAMS", cricket);
        expandableListDetail.put("FOOTBALL TEAMS", football);
        expandableListDetail.put("BASKETBALL TEAMS", basketball);
        return expandableListDetail;
    }
}

In dem obigen Code wird das Objekt expandableListDetail verwendet, um die Gruppenheader-Zeichenfolgen ihren entsprechenden Kindern mit einer ArrayList von Zeichenfolgen zuzuordnen. CustomExpandableListAdapter.java

package com.journaldev.expandablelistview;

import java.util.HashMap;
import java.util.List;
import android.content.Context;
import android.graphics.Typeface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;

public class CustomExpandableListAdapter extends BaseExpandableListAdapter {

    private Context context;
    private List<String> expandableListTitle;
    private HashMap<String, List<String>> expandableListDetail;

    public CustomExpandableListAdapter(Context context, List<String> expandableListTitle,
                                       HashMap<String, List<String>> expandableListDetail) {
        this.context = context;
        this.expandableListTitle = expandableListTitle;
        this.expandableListDetail = expandableListDetail;
    }

    @Override
    public Object getChild(int listPosition, int expandedListPosition) {
        return this.expandableListDetail.get(this.expandableListTitle.get(listPosition))
                .get(expandedListPosition);
    }

    @Override
    public long getChildId(int listPosition, int expandedListPosition) {
        return expandedListPosition;
    }

    @Override
    public View getChildView(int listPosition, final int expandedListPosition,
                             boolean isLastChild, View convertView, ViewGroup parent) {
        final String expandedListText = (String) getChild(listPosition, expandedListPosition);
        if (convertView == null) {
            LayoutInflater layoutInflater = (LayoutInflater) this.context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.list_item, null);
        }
        TextView expandedListTextView = (TextView) convertView
                .findViewById(R.id.expandedListItem);
        expandedListTextView.setText(expandedListText);
        return convertView;
    }

    @Override
    public int getChildrenCount(int listPosition) {
        return this.expandableListDetail.get(this.expandableListTitle.get(listPosition))
                .size();
    }

    @Override
    public Object getGroup(int listPosition) {
        return this.expandableListTitle.get(listPosition);
    }

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

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

    @Override
    public View getGroupView(int listPosition, boolean isExpanded,
                             View convertView, ViewGroup parent) {
        String listTitle = (String) getGroup(listPosition);
        if (convertView == null) {
            LayoutInflater layoutInflater = (LayoutInflater) this.context.
                    getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = layoutInflater.inflate(R.layout.list_group, null);
        }
        TextView listTitleTextView = (TextView) convertView
                .findViewById(R.id.listTitle);
        listTitleTextView.setTypeface(null, Typeface.BOLD);
        listTitleTextView.setText(listTitle);
        return convertView;
    }

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

    @Override
    public boolean isChildSelectable(int listPosition, int expandedListPosition) {
        return true;
    }
}

Diese Klasse erweitert BaseExpandableListAdapter und überschreibt die Methoden der Basisklasse, um die Ansicht für den ExpandableListView bereitzustellen. getView() füllt die Daten in die Ansicht des Elements mit dem angegebenen Index ein. MainActivity.java

package com.journaldev.expandablelistview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    ExpandableListView expandableListView;
    ExpandableListAdapter expandableListAdapter;
    List<String> expandableListTitle;
    HashMap<String, List<String>> expandableListDetail;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        expandableListView = (ExpandableListView) findViewById(R.id.expandableListView);
        expandableListDetail = ExpandableListDataPump.getData();
        expandableListTitle = new ArrayList<String>(expandableListDetail.keySet());
        expandableListAdapter = new CustomExpandableListAdapter(this, expandableListTitle, expandableListDetail);
        expandableListView.setAdapter(expandableListAdapter);
        expandableListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {

            @Override
            public void onGroupExpand(int groupPosition) {
                Toast.makeText(getApplicationContext(),
                        expandableListTitle.get(groupPosition) + " List Expanded.",
                        Toast.LENGTH_SHORT).show();
            }
        });

        expandableListView.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() {

            @Override
            public void onGroupCollapse(int groupPosition) {
                Toast.makeText(getApplicationContext(),
                        expandableListTitle.get(groupPosition) + " List Collapsed.",
                        Toast.LENGTH_SHORT).show();

            }
        });

        expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v,
                                        int groupPosition, int childPosition, long id) {
                Toast.makeText(
                        getApplicationContext(),
                        expandableListTitle.get(groupPosition)
                                + " -> "
                                + expandableListDetail.get(
                                expandableListTitle.get(groupPosition)).get(
                                childPosition), Toast.LENGTH_SHORT
                ).show();
                return false;
            }
        });
    }

}

Im obigen Code haben wir alle zuvor besprochenen Schnittstellen implementiert. Der Einfachheit halber zeigen wir nur einen Toast mit dem Namen des Elements oder dem Zustand der Gruppe bei jedem Klick an. Diese können jedoch leicht geändert werden, um andere Operationen durchzuführen. Hier ist unsere App mit der Android Expandable ListView in Aktion. Hinweis: ExpandableListViews sind standardmäßig scrollbar. Damit endet das Android ExpandableListView-Tutorial. Sie können das endgültige Android ExpandableListView-Projekt über den unten stehenden Link herunterladen.

Android ExpandableListView Beispielprojekt herunterladen

Source:
https://www.digitalocean.com/community/tutorials/android-expandablelistview-example-tutorial