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 Zustandstate_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.
Source:
https://www.digitalocean.com/community/tutorials/android-expandablelistview-example-tutorial