Android UitbreidbareListView Voorbeeld Zelfstudie

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 status state_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.

Download Android ExpandableListView Voorbeeldproject

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