Welkom bij de tutorial van het Android ExpandableListView voorbeeld. In deze tutorial zullen we een ExpandableListView implementeren, die wordt gebruikt om lijstgegevens te groeperen op categorieën. Het is een soort menu en submenu’s in een Android ListView.
Android ExpandableListView
Android ExpandableListView is een weergave die items toont in een verticaal scrollende tweelaagse lijst. Het verschilt van een ListView doordat het twee niveaus toestaat, namelijk groepen die eenvoudig kunnen worden uitgevouwen en samengevouwen door erop te tikken, en hun respectievelijke kinder items. ExpandableListViewAdapter in Android laadt de gegevens in de items die aan deze weergave zijn gekoppeld. Hieronder staan enkele belangrijke methoden die door deze klasse worden gebruikt:
- setChildIndicator(Drawable): Hiermee wordt een indicator naast elk item weergegeven die de huidige status vertegenwoordigt. Als het kind het laatste kind is van een groep, wordt de status
state_last
ingesteld - setGroupIndicator(Drawable): Er wordt een indicator getekend naast de groep die de status ervan vertegenwoordigt, namelijk uitgevouwen of samengevouwen. Als de groep leeg is, wordt de status
state_empty
ingesteld. Als de groep is uitgevouwen, wordt de statusstate_expanded
ingesteld - getGroupView(): Hiermee wordt de weergave teruggegeven voor de koptekst van de lijstgroep.
- getChildView(): Het retourneert de weergave voor een lijstitem van een kind.
De opmerkelijke interfaces die door deze klasse worden geïmplementeerd, worden hieronder gegeven:
- ExpandableListView.OnChildClickListener: Dit wordt overschreven om de callback-methode te implementeren die wordt aangeroepen wanneer een kind in de uitgeklapte lijst wordt aangeklikt.
- ExpandableListView.OnGroupClickListener: Dit wordt overschreven om de callback-methode te implementeren die wordt aangeroepen wanneer er op een groepskop in de uitgeklapte lijst wordt geklikt.
- ExpandableListView.OnGroupCollapseListener: Het wordt gebruikt om te melden wanneer een groep wordt ingeklapt.
- ExpandableListView.OnGroupExpandListener: Het wordt gebruikt om te melden wanneer een groep wordt uitgeklapt.
Structuur van het Android ExpandableListView-project
Dit project bestaat uit drie klassen.
- A MainActivity that shows the layout with the ExpandableListView
- Een ExpandableListDataPump die willekeurige gegevens in een lijst vertegenwoordigt en de gegevens van lijstitems toewijst aan de respectievelijke groepskoppen met behulp van een HashMap.
- A CustomExpandableListAdapter which provides the MainActivity with the data from the ExpandableListDataPump class/li>
Het Android ExpandableListView-code
De layout van activity_main.xml bestaat uit een ExpandableListView in een RelativeLayout zoals hieronder weergegeven: 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>
De android:indicatorLeft is de linker grens voor een indicatie van items. Let op: We kunnen de waarde wrap_content niet gebruiken voor het android:layout_height attribuut van de ExpandableListView
in XML tenzij de grootte van de ouder strikt is gespecificeerd. De lay-out van de groepskop van elke afzonderlijke lijst wordt hieronder gegeven: 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>
De lay-outrij van de kinderitems wordt hieronder gegeven: 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>
De klasse ExpandableListDataPump
is gedefinieerd zoals hieronder:
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 de bovenstaande code wordt het object expandableListDetail
gebruikt om de groepskopteksten te koppelen aan hun respectieve kinderen met behulp van een ArrayList van Strings. 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;
}
}
Deze klasse breidt BaseExpandableListAdapter uit en overschrijft de methoden in de basisklasse om de weergave voor de ExpandableListView te bieden. getView() vult de gegevens in de weergave van het item in met het opgegeven index. 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;
}
});
}
}
In de bovenstaande code hebben we alle interfaces geïmplementeerd die eerder zijn besproken. Voor het gemak tonen we alleen een Toast met de naam van het item of de status van de groep bij elke klik. Maar deze kunnen eenvoudig worden aangepast om andere bewerkingen uit te voeren. Hieronder is onze app met een Android uitbreidbare lijstweergave in actie. Opmerking: Uitbreidbare lijstweergaven zijn standaard scrollbaar. Hiermee komt een einde aan de Android ExpandableListView tutorial. Je kunt het definitieve Android ExpandableListView-project downloaden via de onderstaande link.
Source:
https://www.digitalocean.com/community/tutorials/android-expandablelistview-example-tutorial