如何在Android中创建自定义ExpandableListView?

如何在Android中创建自定义ExpandableListView?,android,listview,Android,Listview,我有一个名为balances的ArrayList,在balances中我有一个对象和另一个ArrayList,我需要在下一幅图像中显示它 在图中,事务是为listView形成的,其中每个listView都有6个文本视图,显示事务属性 private String userID ; private String time ; private String date ; private String transactionStatusCode ; private String referenceID

我有一个名为balances的ArrayList,在balances中我有一个对象和另一个ArrayList,我需要在下一幅图像中显示它

在图中,事务是为listView形成的,其中每个listView都有6个文本视图,显示事务属性

private String userID ;
private String time ;
private String date ;
private String transactionStatusCode ;
private String referenceID ;
private String amountAfterTax ;
private String description;

我读过ExpandableListView,但所有示例都显示了字符串数组。正如您将在我的代码中看到的,我需要显示一个事务对象。

这些对象是由以下JSON组成的

   [{
    "guest": {
        "surname": "BENETOIDE A.1",
        "guestID": "004"
    },
    "transactions": [{
        "userID": "AO15",
        "time": "0600",
        "date": "20161216",
        "transactionStatusCode": "Committed",
        "referenceID": "83366",
        "amountAfterTax": "300.00",
        "description": "RESTAURANT"
    }, {
        "userID": "AO15",
        "time": "0600",
        "date": "20161216",
        "transactionStatusCode": "Committed",
        "referenceID": "83654",
        "amountAfterTax": "100.62",
        "description": "RESTAURANT"
    }, {
        "userID": "AO15",
        "time": "05331",
        "date": "20161217",
        "transactionStatusCode": "Committed",
        "referenceID": "8329",
        "amountAfterTax": "100.62",
        "description": "ROOM SERVICE"
    }, {
        "userID": "S1PR",
        "time": "14554",
        "date": "20170107",
        "transactionStatusCode": "Committed",
        "referenceID": "2524",
        "amountAfterTax": "636.93",
        "description": "ROOM SERVICE"
    }]
}, {
    "guest": {
        "surname": "ALDITOY A.0",
        "guestID": "005"
    },
    "transactions": [{
        "userID": "AO15",
        "time": "0510",
        "date": "20161222",
        "transactionStatusCode": "Committed",
        "referenceID": "94257",
        "amountAfterTax": "300.00",
        "description": "ROOM SERVICE"
    }, {
        "userID": "AO15",
        "time": "0510",
        "date": "20161222",
        "transactionStatusCode": "Committed",
        "referenceID": "92355",
        "amountAfterTax": "33.54",
        "description": "ROOM SERVICE"
    },  {
        "userID": "GT10",
        "time": "1405",
        "date": "20170109",
        "transactionStatusCode": "Committed",
        "referenceID": "19260",
        "amountAfterTax": "302.00",
        "description": "RESTAURANT"
    }]
}]
我创建了一个名为BalanceAdapter的类,该类从BaseExpandableListAdapter扩展而来,在这里我尝试显示项目,就像我从ArrayAdapter扩展时通常做的那样

package com.softwareengineerandroid.davidmata.coreclasses.Balance;

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

import com.softwareengineerandroid.davidmata.armletpaymentpilot.R;
import com.softwareengineerandroid.davidmata.coreclasses.transaction.Transaction;

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

/**
 * Created by davidmata on 18/03/2017.
 */

public class BalanceAdapter extends BaseExpandableListAdapter {
private Context context;
private List<String> expanableListTitle;
private HashMap<String, ArrayList<Transaction>> expandableListDatails;
private LayoutInflater inflater;

public BalanceAdapter(Context context, List<Balance> listBalance){
    inflater=    (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.context = context;
    expanableListTitle = new ArrayList<>();
    expandableListDatails = new HashMap<>();
    Map<String, ArrayList<Transaction>> map = new HashMap<>();
    int i=0;
    for (Balance balance:listBalance) {
        expanableListTitle.add(balance.getGuest().getSurname());

        map.put(balance.getGuest().getSurname()+i,(ArrayList<Transaction>) balance.getTransactions());
        i++;//evita ducplicacion de nombre de huespedes.
    }
    this.expandableListDatails = (HashMap)map;



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

@Override
public int getChildrenCount(int groupPosition) {
    return 0;
}

@Override
public Object getGroup(int groupPosition) {
    return null;
}

@Override
public Object getChild(int groupPosition, int childPosition) {
    return this.expandableListDatails.get(this.expanableListTitle.get(groupPosition)).get(childPosition);
}

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

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

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

@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
    return null;
}

@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
    if(convertView==null){
        convertView = inflater.inflate(R.layout.list_balance_item,null);
    }
    Transaction transaction =(Transaction) getChild(groupPosition,childPosition);
    TextView tv_description = (TextView)convertView.findViewById(R.id.listBalance_description);
    TextView tv_referenceID = (TextView)convertView.findViewById(R.id.listBalance_referenceID);
    TextView tv_amount = (TextView)convertView.findViewById(R.id.listBalance_amount);
    TextView tv_currencycode = (TextView)convertView.findViewById(R.id.listBalance_currencyCode);
    TextView tv_date = (TextView)convertView.findViewById(R.id.listBalance_date);
    TextView tv_time = (TextView)convertView.findViewById(R.id.listBalance_time);

    return convertView;
}

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
    return false;
}
}

This is my **list_balance_item.xml**.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
android:padding="16dp"
android:divider="@null"
android:dividerHeight="0dp">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    >
    <TextView
        android:id="@+id/listBalance_description"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:text="SERVICE ROOM"
        android:textSize="20dp"
        android:textStyle="bold"
         />
    <TextView
        android:id="@+id/listBalance_amount"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="$850.63"
        android:textSize="20dp"
        android:textStyle="bold"/>
</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:paddingTop="8dp"
    >
    <TextView
        android:id="@+id/listBalance_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:text="18/AGO/2017"/>
    <TextView
        android:id="@+id/listBalance_time"
        android:paddingLeft="16dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"

        android:text="12:08"/>
</LinearLayout>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:paddingTop="8dp"
    >
    <TextView
        android:id="@+id/listBalance_currencyCode"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="CurrencyCode: MXN"/>
    <TextView
        android:id="@+id/listBalance_referenceID"
        android:paddingLeft="16dp"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Feference : 1671"/>
</LinearLayout>
</LinearLayout>
package com.softwareeneerandroid.daviddata.coreclasses.Balance;
导入android.content.Context;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.BaseExpandableListAdapter;
导入android.widget.ListAdapter;
导入android.widget.TextView;
导入com.softwareengineerandroid.daviddata.armletpaymentpilot.R;
导入com.softwareerneerandroid.daviddata.coreclasses.transaction.transaction;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
/**
*由davidmata于2017年3月18日创建。
*/
公共类BalanceAdapter扩展了BaseExpandableListAdapter{
私人语境;
私有列表expanableListTitle;
私有HashMap expandableListDatails;
私人充气机;
public BalanceAdapter(上下文,列表平衡){
充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
this.context=上下文;
expanableListTitle=新的ArrayList();
expandableListDatails=newHashMap();
Map Map=newhashmap();
int i=0;
for(余额:listBalance){
expanableListTitle.add(balance.getGuest().getLastName());
map.put(balance.getGuest().getname()+i,(ArrayList)balance.getTransactions());
i++;//evita Ducplicion de nombre de huespedes。
}
this.expandableListDatails=(HashMap)映射;
}
@凌驾
public int getGroupCount(){
返回0;
}
@凌驾
公共整数getChildrenCount(整数组位置){
返回0;
}
@凌驾
公共对象getGroup(int-groupPosition){
返回null;
}
@凌驾
公共对象getChild(int-groupPosition,int-childPosition){
返回this.expandableListDatails.get(this.expanableListTitle.get(groupPosition)).get(childPosition);
}
@凌驾
公共长getGroupId(int-groupPosition){
返回0;
}
@凌驾
公共长getChildId(int-groupPosition,int-childPosition){
返回子位置;
}
@凌驾
公共布尔表ID(){
返回false;
}
@凌驾
公共视图getGroupView(int groupPosition、布尔isExpanded、视图convertView、视图组父级){
返回null;
}
@凌驾
公共视图getChildView(int-groupPosition、int-childPosition、布尔isLastChild、视图convertView、视图组父级){
if(convertView==null){
convertView=充气机。充气(右布局。列表\平衡\项,空);
}
事务事务=(事务)getChild(groupPosition,childPosition);
TextView tv_description=(TextView)convertView.findViewById(R.id.listBalance_description);
TextView tv_referenceID=(TextView)convertView.findViewById(R.id.listBalance_referenceID);
TextView tv\u金额=(TextView)convertView.findViewById(R.id.listBalance\u金额);
TextView tv\u currencycode=(TextView)convertView.findViewById(R.id.listBalance\u currencycode);
TextView tv_date=(TextView)convertView.findViewById(R.id.listBalance_date);
TextView tv_time=(TextView)convertView.findViewById(R.id.listBalance_time);
返回视图;
}
@凌驾
公共布尔值isChildSelectable(int-groupPosition,int-childPosition){
返回false;
}
}
这是我的**列表\余额\项目。xml**。
fragment\u balance.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
    tools:context="com.softwareengineerandroid.davidmata.armletpaymentpilot.FragmentBalance">

<ExpandableListView
    android:id="@+id/fragBalance_expListView"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</ExpandableListView>

</LinearLayout>

FragmentBalace.java,我应该在哪里设置适配器

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_balance, container, false);
    ListView balanceList = (ListView)view.findViewById(R.id.fragBalance_listview);
    ArrayList<Balance> arrayList = null;
    try {
        arrayList = (ArrayList<Balance>) new BalanceController(new BalanceFromApiJson()).getBalance(getContext(),"http://192.168.1.100:50591/api/Balance?reservationID=45454655465");
        BalanceAdapter balanceAdapter = new BalanceAdapter(getContext(),arrayList);
    } catch (ExecutionException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
   // TransationAdapter balanceAdapter = new         TransationAdapter(getActivity(), arrayList);
   // balanceList.setAdapter(balanceAdapter);


    return view;
}
@覆盖
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
视图=充气机。充气(R.layout.fragment\u天平,容器,假);
ListView balanceList=(ListView)view.findViewById(R.id.fragBalance_ListView);
ArrayList ArrayList=null;
试一试{
arrayList=(arrayList)new BalanceController(new BalanceFromApiJson()).getBalance(getContext(),”http://192.168.1.100:50591/api/Balance?reservationID=45454655465");
BalanceAdapter BalanceAdapter=新的BalanceAdapter(getContext(),arrayList);
}捕获(执行例外){
e、 printStackTrace();
}捕捉(中断异常e){
e、 printStackTrace();
}
//TransactionAdapter balanceAdapter=新的TransactionAdapter(getActivity(),arrayList);
//balanceList.setAdapter(balanceAdapter);
返回视图;
}

我建议您搜索如何使用
ExpandableListView

或者查看其Decumentation的此链接

谢谢,现在我要更改问题,询问ExpandableListView