如何使用 arraylist 制作可扩展列表?

how to make expandable list using arraylist?

我需要制作一个可扩展的列表视图,但对于父级,我必须传递 arraylist 并且我在 getGroupView 中得到 class 转换异常。请帮助我编写以下适配器:

PhraseModel.java :

package in.abc.pdfsearchapp;

import android.os.Parcel;
import android.os.Parcelable;
import java.util.ArrayList;

public class PhraseModel implements Parcelable {

    private ArrayList<PhraseList> phraseList;

    // constructor

    public PhraseModel(ArrayList<PhraseList> phraseList) {
        this.phraseList = phraseList;
    }

    //---------------------------Getter-Setter--------------------------------------------------------------------------------
    public ArrayList<PhraseList> getPhraseList() {
        return phraseList;
    }

    public void setPhraseList(ArrayList<PhraseList> phraseList) {
        this.phraseList = phraseList;
    }

    // Parcelling

    protected PhraseModel(Parcel in) {
        phraseList=in.createTypedArrayList(PhraseList.CREATOR);
    }

    public static final Creator<PhraseModel> CREATOR = new Creator<PhraseModel>() {
        @Override
        public PhraseModel createFromParcel(Parcel in) {
            return new PhraseModel(in);
        }

        @Override
        public PhraseModel[] newArray(int size) {
            return new PhraseModel[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeTypedList(phraseList);
    }


    //-----------------------------------   //PhraseList // ------------------------------------------------------------------------

    public static class PhraseList implements Parcelable {

        public int documentId,noOfOccurences;
        public String documentName,phrase;
        public ArrayList<OccurenceDetails> occurenceDetails;

        //constructor

        public PhraseList(int documentId, String documentName,String phrase, int noOfOccurences,  ArrayList<OccurenceDetails> occurenceDetails) {
            this.documentId = documentId;
            this.documentName = documentName;
            this.phrase = phrase;
            this.noOfOccurences = noOfOccurences;
            this.occurenceDetails = occurenceDetails;
        }
        //------------------------------Getter-Setter--------------------------------------------------------------------------------------

        public int getDocumentId() {
            return documentId;
        }

        public void setDocumentId(int documentId) {
            this.documentId = documentId;
        }

        public int getNoOfOccurences() {
            return noOfOccurences;
        }

        public void setNoOfOccurences(int noOfOccurences) {
            this.noOfOccurences = noOfOccurences;
        }

        public String getDocumentName() {
            return documentName;
        }

        public void setDocumentName(String documentName) {
            this.documentName = documentName;
        }

        public String getPhrase() {
            return phrase;
        }

        public void setPhrase(String phrase) {
            this.phrase = phrase;
        }

        public ArrayList<OccurenceDetails> getOccurenceDetails() {
            return occurenceDetails;
        }

        public void setOccurenceDetails(ArrayList<OccurenceDetails> occurenceDetails) {
            this.occurenceDetails = occurenceDetails;
        }

        //Parcelling

        protected PhraseList(Parcel in) {
            documentId = in.readInt();
            noOfOccurences = in.readInt();
            documentName = in.readString();
            phrase = in.readString();
        }

        public static final Creator<PhraseList> CREATOR = new Creator<PhraseList>() {
            @Override
            public PhraseList createFromParcel(Parcel in) {
                return new PhraseList(in);
            }

            @Override
            public PhraseList[] newArray(int size) {
                return new PhraseList[size];
            }
        };

        @Override
        public int describeContents() {
            return 0;
        }

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeInt(documentId);
            dest.writeString(documentName);
            dest.writeInt(noOfOccurences);
            dest.writeString(phrase);
        }
    }


//---------------------------------    //OccurrenceDetails // --------------------------------------------------------------------

    public static class OccurenceDetails implements Parcelable {

        int occurenceId,pageNo;
        String fullPhrase;

        //constructor

        public OccurenceDetails(int occurenceId, int pageNo, String fullPhrase) {
            this.occurenceId = occurenceId;
            this.pageNo = pageNo;
            this.fullPhrase = fullPhrase;
        }
//-------------------------------Getter-Setter----------------------------------------------------------------------------------

        public int getOccurenceId() {
            return occurenceId;
        }

        public void setOccurenceId(int occurenceId) {
            this.occurenceId = occurenceId;
        }

        public int getPageNo() {
            return pageNo;
        }

        public void setPageNo(int pageNo) {
            this.pageNo = pageNo;
        }

        public String getFullPhrase() {
            return fullPhrase;
        }

        public void setFullPhrase(String fullPhrase) {
            this.fullPhrase = fullPhrase;
        }


        //Parcelling

        protected OccurenceDetails(Parcel in) {
            occurenceId = in.readInt();
            pageNo = in.readInt();
            fullPhrase = in.readString();
        }

        public static final Creator<OccurenceDetails> CREATOR = new Creator<OccurenceDetails>() {
            @Override
            public OccurenceDetails createFromParcel(Parcel in) {
                return new OccurenceDetails(in);
            }

            @Override
            public OccurenceDetails[] newArray(int size) {
                return new OccurenceDetails[size];
            }
        };

        @Override
        public int describeContents() {
            return 0;
        }

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeInt(occurenceId);
            dest.writeInt(pageNo);
            dest.writeString(fullPhrase);
        }
    }
}

ExpandableListAdapter.java :

package in.abc.pdfsearchapp;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;

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

/**
 * Created by Android on 22-Nov-17.
 */

public class ExpandableListAdapter extends BaseExpandableListAdapter {

    Context context;
    public ArrayList<PhraseModel.PhraseList> mPhraseList;
    private HashMap<Integer,ArrayList<PhraseModel.OccurenceDetails>> occurenceList;

    public ExpandableListAdapter(Context context, ArrayList<PhraseModel.PhraseList> mPhraseList, HashMap<Integer, ArrayList<PhraseModel.OccurenceDetails>> occurenceList) {
        this.context = context;
        this.mPhraseList = mPhraseList;
        this.occurenceList = occurenceList;
    }

    public Object getChild(int groupPosition, int childPosition){
        return this.occurenceList.get(this.mPhraseList.get(groupPosition)).get(childPosition);
    }


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


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

        final ArrayList<PhraseModel.OccurenceDetails> childList = (ArrayList<PhraseModel.OccurenceDetails>) getChild(groupPosition, childPosition);
        if(convertView==null){
            LayoutInflater infalInflater = (LayoutInflater) this.context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_item, null);
        }

        TextView occurenceId,fullPhrase,pageNo;
        occurenceId=(TextView)convertView.findViewById(R.id.occurenceId);
        fullPhrase=(TextView)convertView.findViewById(R.id.fullPhrase);
        pageNo=(TextView)convertView.findViewById(R.id.pageNo);

        occurenceId.setText(childList.get(groupPosition).getOccurenceId());
        fullPhrase.setText(childList.get(groupPosition).getFullPhrase());
        pageNo.setText(childList.get(groupPosition).getPageNo());

        return convertView;
    }

    public int getChildrenCount(int groupPosition) {
        return this.occurenceList.get(this.mPhraseList.get(groupPosition))
                .size();
    }

    public Object getGroup(int groupPosition) {
        return this.mPhraseList.get(groupPosition);
    }

    public int getGroupCount() {
        return this.mPhraseList.size();
    }

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

    public View getGroupView(int groupPosition, boolean isExpanded,
                             View convertView, ViewGroup parent) {
        ArrayList<PhraseModel.PhraseList> parentList = (ArrayList<PhraseModel.PhraseList>) getGroup(groupPosition);
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this.context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_group, null);
        }

        TextView docName,totalOccurences;
        docName=(TextView)convertView.findViewById(R.id.docName);
        totalOccurences=(TextView)convertView.findViewById(R.id.totalOccurences);
        docName.setText(parentList.get(groupPosition).getDocumentName());
        totalOccurences.setText(parentList.get(groupPosition).getNoOfOccurences());
        return convertView;
    }

    public boolean hasStableIds() {
        return false;
    }

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

LandingActivity.java :

    package in.abc.pdfsearchapp;

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

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;

public class LandingActivity extends AppCompatActivity {

    ExpandableListAdapter listAdapter;
    ExpandableListView expListView;
    ArrayList<PhraseModel.PhraseList> phraseLists;
    HashMap<Integer, ArrayList<PhraseModel.OccurenceDetails>> occurenceList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_landing);

        expListView = (ExpandableListView) findViewById(R.id.phraseList);

        // preparing list data
        phraseLists=new ArrayList<PhraseModel.PhraseList>();
        occurenceList=new HashMap<Integer,ArrayList<PhraseModel.OccurenceDetails>>();
        phraseLists.addAll(getmphraseset());

        for (PhraseModel.PhraseList pl: phraseLists){
            ArrayList<PhraseModel.OccurenceDetails>occurenceDetailses=pl.getOccurenceDetails();
            occurenceList.put(pl.getDocumentId(),occurenceDetailses);
        }

        listAdapter = new ExpandableListAdapter(this, phraseLists,occurenceList);

        // setting list adapter
        expListView.setAdapter(listAdapter);

        // Listview Group click listener
        expListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {

            @Override
            public boolean onGroupClick(ExpandableListView parent, View v,
                                        int groupPosition, long id) {
                // Toast.makeText(getApplicationContext(),
                // "Group Clicked " + listDataHeader.get(groupPosition),
                // Toast.LENGTH_SHORT).show();
                return false;
            }
        });

        // Listview Group expanded listener
        expListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {

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

        // Listview Group collasped listener
        expListView.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() {

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

            }
        });

        // Listview on child click listener
        expListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {

            @Override
            public boolean onChildClick(ExpandableListView parent, View v,
                                        int groupPosition, int childPosition, long id) {
                // TODO Auto-generated method stub
                Toast.makeText(
                        getApplicationContext(),
                        phraseLists.get(groupPosition)
                                + " : "
                                + occurenceList.get(
                                phraseLists.get(groupPosition)).get(
                                childPosition), Toast.LENGTH_SHORT)
                        .show();
                return false;
            }
        });

    }

    private ArrayList<PhraseModel.PhraseList> getmphraseset() {
        try{
            ArrayList<PhraseModel.PhraseList>phrase_Lists = new ArrayList<PhraseModel.PhraseList>();
            ArrayList<PhraseModel.OccurenceDetails>occurenceDetailsArrayList=new ArrayList<PhraseModel.OccurenceDetails>();
            JSONObject jsonObject = new JSONObject(readJSONFromAsset());

            JSONArray phraseArray = jsonObject.getJSONArray("phraseList");
            Log.d("getmphraseset", "phrase count: "+phraseArray.length());
            for (int i = 0; i < phraseArray.length(); i++)
            {
                JSONObject job = phraseArray.getJSONObject(i);

                int documentId =job.getInt("documentId");
                int noOfOccurences=job.getInt("noOfOccurences");

                String documentName=job.getString("documentName");
                String phrase=job.getString("phrase");

                //This i for Occurences array
                ArrayList<PhraseModel.OccurenceDetails> occurencesList = new ArrayList<>();
                JSONArray occurencesArray = job.getJSONArray("occurenceDetails");
                for (int j = 0; j < occurencesArray.length(); j++) {
                    JSONObject jobIn = occurencesArray.getJSONObject(j);

                    int occurenceId=jobIn.getInt("occurenceId");
                    int pageNo=jobIn.getInt("pageNo");
                    String fullPhrase=jobIn.getString("fullPhrase");

                    occurencesList.add(new PhraseModel.OccurenceDetails(occurenceId, pageNo, fullPhrase));

                }

                //here your Phrase[] value store in pdfArrayList
                phrase_Lists.add(new PhraseModel.PhraseList(documentId,documentName,phrase,noOfOccurences,occurencesList));

                Log.i("phraseList size = ", ""+phraseArray.length());
            }

            if (phrase_Lists != null)
            {
                Log.i("phraseList size = ", ""+phraseArray.length());
            }
            return phrase_Lists;
        }catch (JSONException e){
            e.printStackTrace();
            return null;
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    public String readJSONFromAsset() {
        String json = null;
        try {
            InputStream is = getAssets().open("hipaJson.json");
            int size = is.available();
            byte[] buffer = new byte[size];
            is.read(buffer);
            is.close();
            json = new String(buffer, "UTF-8");
        } catch (IOException ex) {
            ex.printStackTrace();
            return null;
        }
        return json;
    }
}

Logcat :

11-23 15:52:06.428 1519-2794/? E/ActivityManager: applyOptionsLocked: Unknown animationType=0
11-23 15:52:06.428 459-2412/? E/ANDR-PERF-MPCTL: Invalid profile no. 0, total profiles 0 only
11-23 15:52:07.059 29210-29210/? E/HAL: PATH3 /odm/lib64/hw/gralloc.qcom.so
11-23 15:52:07.059 29210-29210/? E/HAL: PATH2 /vendor/lib64/hw/gralloc.qcom.so
11-23 15:52:07.059 29210-29210/? E/HAL: PATH1 /system/lib64/hw/gralloc.qcom.so
11-23 15:52:07.059 29210-29210/? E/HAL: PATH3 /odm/lib64/hw/gralloc.msm8953.so
11-23 15:52:07.059 29210-29210/? E/HAL: PATH2 /vendor/lib64/hw/gralloc.msm8953.so
11-23 15:52:07.059 29210-29210/? E/HAL: PATH1 /system/lib64/hw/gralloc.msm8953.so
11-23 15:52:11.066 459-2412/? E/ANDR-PERF-MPCTL: Invalid profile no. 0, total profiles 0 only
11-23 15:52:11.152 29210-29210/? E/AndroidRuntime: FATAL EXCEPTION: main
                                                   Process: in.hkcl.pdfsearchapp, PID: 29210
                                                   java.lang.ClassCastException: in.hkcl.pdfsearchapp.PhraseModel$PhraseList cannot be cast to java.util.ArrayList
                                                       at in.hkcl.pdfsearchapp.ExpandableListAdapter.getGroupView(ExpandableListAdapter.java:81)
                                                       at android.widget.ExpandableListConnector.getView(ExpandableListConnector.java:446)
                                                       at android.widget.AbsListView.obtainView(AbsListView.java:2367)
                                                       at android.widget.ListView.makeAndAddView(ListView.java:1972)
                                                       at android.widget.ListView.fillDown(ListView.java:704)
                                                       at android.widget.ListView.fillFromTop(ListView.java:765)
                                                       at android.widget.ListView.layoutChildren(ListView.java:1744)
                                                       at android.widget.AbsListView.onLayout(AbsListView.java:2161)
                                                       at android.view.View.layout(View.java:17548)
                                                       at android.view.ViewGroup.layout(ViewGroup.java:5614)

请解释和帮助,我做错了什么??该应用程序有闪屏 > landingActivity 包含可扩展列表,我无法将其显示为应用程序崩溃,在 getGroupView 方法中给出 class cat 异常。

list_group.xml :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto">

<android.support.v7.widget.CardView
    android:id="@+id/parent_phraseList_card"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#BDBDBD"
    app:cardElevation="4dp"
    android:padding="8dp">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#FFFFFF"
        android:padding="5dp">

    <TextView
        android:id="@+id/docNameLabel"
        android:layout_width="120dp"
        android:layout_height="wrap_content"
        android:text="Doc Name : "
        android:textStyle="bold"/>
    <TextView
        android:id="@+id/docName"
        android:layout_toRightOf="@id/docNameLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <TextView
        android:id="@+id/totalOccurencesLabel"
        android:layout_below="@id/docNameLabel"
        android:layout_width="120dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:text="Total Occurences : "
        android:textStyle="bold"/>
    <TextView
        android:id="@+id/totalOccurences"
        android:layout_toRightOf="@id/totalOccurencesLabel"
        android:layout_below="@id/docNameLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"/>

    <ImageButton
        android:id="@+id/linkToDirectOpenDoc_btn"
        android:layout_below="@id/totalOccurencesLabel"
        android:layout_centerHorizontal="true"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:src="@drawable/link"
        android:elevation="6dp"
        android:layout_marginTop="5dp"/>

    <ImageButton
        android:id="@+id/expandCard_btn"
        android:layout_below="@id/totalOccurencesLabel"
        android:layout_toRightOf="@id/linkToDirectOpenDoc_btn"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:src="@drawable/expand"
        android:elevation="6dp"
        android:layout_marginTop="5dp"/>
    </RelativeLayout>
</android.support.v7.widget.CardView>

</RelativeLayout>

list_item.xml :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:elevation="4dp"
        android:padding="8dp">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="5dp"
            android:background="#FFFFFF">

            <TextView
                android:id="@+id/occurenceId_label"
                android:layout_width="120dp"
                android:layout_height="wrap_content"
                android:text="Occurence : "
                android:textStyle="bold"/>
            <TextView
                android:id="@+id/occurenceId"
                android:layout_toRightOf="@id/occurenceId_label"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
            <TextView
                android:id="@+id/fullPhrase_label"
                android:layout_below="@id/occurenceId_label"
                android:layout_width="120dp"
                android:layout_height="wrap_content"
                android:text="Full Phrase : "
                android:textStyle="bold"
                android:layout_marginTop="5dp"/>
            <TextView
                android:id="@+id/fullPhrase"
                android:layout_below="@id/occurenceId_label"
                android:layout_toRightOf="@id/fullPhrase_label"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"/>

            <TextView
                android:id="@+id/pageNo_label"
                android:layout_below="@id/fullPhrase_label"
                android:layout_width="120dp"
                android:layout_height="wrap_content"
                android:text="Full Phrase : "
                android:textStyle="bold"
                android:layout_marginTop="5dp"/>
            <TextView
                android:id="@+id/pageNo"
                android:layout_below="@id/fullPhrase_label"
                android:layout_toRightOf="@id/pageNo_label"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"/>

        </RelativeLayout>

    </android.support.v7.widget.CardView>

</RelativeLayout>

尝试替换

ArrayList<PhraseModel.PhraseList> parentList = (ArrayList<PhraseModel.PhraseList>) getGroup(groupPosition);

来自

PhraseList parentList = (PhraseList) getGroup(groupPosition);

这可能有帮助

 //Change this
 ArrayList<PhraseModel.PhraseList> parentList = (ArrayList<PhraseModel.PhraseList>) getGroup(groupPosition);

 //To
 PhraseModel.PhraseList mPhraseListItem = getGroup(groupPosition);

 //AND getGroup return type to PhraseModel.PhraseList
 public PhraseModel.PhraseList getGroup(int groupPosition) {
    return this.mPhraseList.get(groupPosition);
 }

根据要求更新

I made Some Change In Your ExpandableListAdapter class. I made it as simple as possible. Just Copy and Paste This Class.

public class ExpandableListAdapter extends BaseExpandableListAdapter {

Context context;

ExpandableListView expandableListView;

private ArrayList<PhraseModel.PhraseList> mPhraseList;

private int lastExpandedPosition = -1;



public ExpandableListAdapter(Context context, ArrayList<PhraseModel.PhraseList> mPhraseList, ExpandableListView expandableListView) {
    this.context = context;
    this.mPhraseList = mPhraseList;
    this.expandableListView = expandableListView;
}

public PhraseModel.OccurenceDetails getChild(int groupPosition, int childPosition){
    return this.mPhraseList.get(groupPosition).getOccurenceDetails().get(childPosition);
}


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


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

    final PhraseModel.OccurenceDetails occurenceDetails =  getChild(groupPosition, childPosition);
    if(convertView==null){
        LayoutInflater infalInflater = (LayoutInflater) this.context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.list_item, null);
    }

    TextView occurenceId,fullPhrase,pageNo;
    occurenceId=(TextView)convertView.findViewById(R.id.occurenceId);
    fullPhrase=(TextView)convertView.findViewById(R.id.fullPhrase);
    pageNo=(TextView)convertView.findViewById(R.id.pageNo);

    occurenceId.setText(String.valueOf(occurenceDetails.getOccurenceId()));
    fullPhrase.setText(occurenceDetails.getFullPhrase());
    pageNo.setText(String.valueOf(occurenceDetails.getPageNo()));

    return convertView;
}

public int getChildrenCount(int groupPosition) {
    return this.mPhraseList.get(groupPosition).getOccurenceDetails().size();
}

public PhraseModel.PhraseList getGroup(int groupPosition) {
    return this.mPhraseList.get(groupPosition);
}

public int getGroupCount() {
    return this.mPhraseList.size();
}

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

public View getGroupView(final int groupPosition, boolean isExpanded,
                         View convertView, ViewGroup parent) {
    PhraseModel.PhraseList parentList =  getGroup(groupPosition);
    if (convertView == null) {
        LayoutInflater infalInflater = (LayoutInflater) this.context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.list_group, null);
    }

    TextView docName,totalOccurences;
    docName=(TextView)convertView.findViewById(R.id.docName);
    totalOccurences=(TextView)convertView.findViewById(R.id.totalOccurences);
    docName.setText(parentList.getDocumentName());
    totalOccurences.setText(String.valueOf(parentList.getNoOfOccurences()));

    ImageButton linkToDirectOpenDoc_btn, expandCard_btn;

    linkToDirectOpenDoc_btn = (ImageButton) convertView.findViewById(R.id.linkToDirectOpenDoc_btn);
    linkToDirectOpenDoc_btn.setFocusable(false);


    expandCard_btn = (ImageButton) convertView.findViewById(R.id.expandCard_btn);
    expandCard_btn.setFocusable(false);

    expandCard_btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

                if (lastExpandedPosition == groupPosition) {

                    expandableListView.collapseGroup(lastExpandedPosition);

                    lastExpandedPosition = -1;

                } else {

                    expandableListView.collapseGroup(lastExpandedPosition);

                    lastExpandedPosition = groupPosition;

                    expandableListView.expandGroup(lastExpandedPosition);


                }

        }
    });

    return convertView;
}

public boolean hasStableIds() {
    return false;
}

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

Then in your Activity put below code to set up adapters and array lists. This is just for your reference you have to make change it as per your need, so you can get this values from your assets.

    //FIRST GROUP

    PhraseModel.OccurenceDetails oneOccurenceDetails = new PhraseModel.OccurenceDetails(1, 20, "Occurence Details Pharse One");
    ArrayList<PhraseModel.OccurenceDetails> firstOccurenceDetails = new ArrayList<>();
    firstOccurenceDetails.add(oneOccurenceDetails);
    PhraseModel.PhraseList onePhraseList = new PhraseModel.PhraseList(1,
            "Doc One", "Pharse One", 10, firstOccurenceDetails);

    //SECOND GROUP
    PhraseModel.OccurenceDetails twoOccurenceDetails = new PhraseModel.OccurenceDetails(2, 30, "Occurence Details Pharse Second");
    ArrayList<PhraseModel.OccurenceDetails> secondOccurenceDetails = new ArrayList<>();
    secondOccurenceDetails.add(twoOccurenceDetails);
    PhraseModel.PhraseList twoPhraseList = new PhraseModel.PhraseList(1,
            "Doc Two", "Pharse Two", 10, secondOccurenceDetails);


    ArrayList<PhraseModel.PhraseList> onePhraseArrayList = new ArrayList<>();
    onePhraseArrayList.add(onePhraseList);
    onePhraseArrayList.add(twoPhraseList);

    ExpandableListAdapter expandableListAdapter = new ExpandableListAdapter(this, onePhraseArrayList, expandableListView);

    expandableListView.setAdapter(expandableListAdapter);
Try this code,


 public class ExpandableListMAdapter extends BaseExpandableListAdapter {

        Context context;
        public ArrayList<String> mPhraseList;
        private HashMap<Integer,ArrayList<String>> occurenceList;

        public ExpandableListMAdapter(Context context, ArrayList<String> mPhraseList, HashMap<Integer, ArrayList<String>> occurenceList) {
            this.context = context;
            this.mPhraseList = mPhraseList;
            this.occurenceList = occurenceList;
        }

        public Object getChild(int groupPosition, int childPosition){
            return this.occurenceList.get(this.mPhraseList.get(groupPosition)).get(childPosition);
        }


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


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

            final ArrayList<String> childList = occurenceList.get(groupPosition);
            if(convertView==null){
                LayoutInflater infalInflater = (LayoutInflater) this.context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = infalInflater.inflate(R.layout.list_item, null);
            }

            TextView txtchild;
            txtchild=(TextView)convertView.findViewById(R.id.txtchild);
            txtchild.setText(childList.get(childPosition));
           /* TextView occurenceId,fullPhrase,pageNo;
            occurenceId=(TextView)convertView.findViewById(R.id.occurenceId);
            fullPhrase=(TextView)convertView.findViewById(R.id.fullPhrase);
            pageNo=(TextView)convertView.findViewById(R.id.pageNo);

            occurenceId.setText(childList.get(groupPosition).getOccurenceId());
            fullPhrase.setText(childList.get(groupPosition).getFullPhrase());
            pageNo.setText(childList.get(groupPosition).getPageNo());*/

            return convertView;
        }

        public int getChildrenCount(int groupPosition) {
            return this.occurenceList.get(groupPosition).size();    }

        public Object getGroup(int groupPosition) {
            return this.mPhraseList.get(groupPosition);
        }

        public int getGroupCount() {
            return this.mPhraseList.size();
        }

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

        public View getGroupView(int groupPosition, boolean isExpanded,
                                 View convertView, ViewGroup parent) {
            ArrayList<String> parentList = mPhraseList;
            if (convertView == null) {
                LayoutInflater infalInflater = (LayoutInflater) this.context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = infalInflater.inflate(R.layout.list_group, null);
            }

            TextView txtgroup;
            txtgroup=(TextView)convertView.findViewById(R.id.txtgroup);
            txtgroup.setText(parentList.get(groupPosition));
           /* TextView docName,totalOccurences;
            docName=(TextView)convertView.findViewById(R.id.docName);
            totalOccurences=(TextView)convertView.findViewById(R.id.totalOccurences);
            docName.setText(parentList.get(groupPosition).getDocumentName());
            totalOccurences.setText(parentList.get(groupPosition).getNoOfOccurences());*/
            return convertView;
        }

        public boolean hasStableIds() {
            return false;
        }

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