Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ExpandableListView:从childs获取输入值_Java_Android_Xml_Expandablelistview_Expandablelistadapter - Fatal编程技术网

Java ExpandableListView:从childs获取输入值

Java ExpandableListView:从childs获取输入值,java,android,xml,expandablelistview,expandablelistadapter,Java,Android,Xml,Expandablelistview,Expandablelistadapter,我正在将一个JSON解析为一个ExpandableListView,用户可以在每个孩子上选择他想要的每个孩子的数量。+/-按钮连接到文本视图,其中显示每个子项的总金额,总成本将显示在行的末尾 在父级的底部应该有一个TextView,其中包含ExpListView摘要的每个子级中计算的所有值的摘要 底部的OK按钮应该将每个子项的金额发送到服务器,该金额连接到一个ID 当我点击OK按钮时,我在读出每个孩子的数量方面遇到了问题——我如何才能建立起通向我孩子价值观的桥梁 我还遇到读取每个孩子的成本来计算

我正在将一个JSON解析为一个ExpandableListView,用户可以在每个孩子上选择他想要的每个孩子的数量。+/-按钮连接到文本视图,其中显示每个子项的总金额,总成本将显示在行的末尾

在父级的底部应该有一个TextView,其中包含ExpListView摘要的每个子级中计算的所有值的摘要 底部的OK按钮应该将每个子项的金额发送到服务器,该金额连接到一个ID

当我点击OK按钮时,我在读出每个孩子的数量方面遇到了问题——我如何才能建立起通向我孩子价值观的桥梁

我还遇到读取每个孩子的成本来计算底部的总成本的问题。孩子中的onClickListener应该以某种方式刷新底部的TextView,但据我所知,这并不容易,对吧

有人知道如何访问这些值吗

这是我的ListAdapter的子视图,神奇之处在于:

public class ExpandableListAdapterDrinks extends BaseExpandableListAdapter {
private Context context;
private List<String> listDataHeader,listDataHeaderPrice;
private HashMap<String,List<String>> listHashMap;
private List<Drink> drinksList;


class ViewHolder {
    TextView childText,counterText, childUnitPrice, childFinalPrice;
    Button btn_plus,btn_minus;

}

class DrinksListChildItem{
    String name;
    int quantity;
    DrinksListChildItem(String name, int quantity){
        this.name = name;
        this.quantity = quantity;
    }
}

class Pos{
    int group;
    int child;
    Pos(int group, int child){
        this.group = group;
        this.child = child;
    }
}




public ExpandableListAdapterDrinks(Context context, List<Drink> drinksList) {
    this.context = context;
    this.drinksList= drinksList;

  }




@Override
public int getGroupCount() {
    return drinksList.size();
}


@Override
public int getChildrenCount(int groupPosition) {

    return drinksList.get(groupPosition).getContent().size();

}

@Override
public Object getGroup(int groupPosition) {
    return drinksList.get(groupPosition);
}


@Override
public Object getChild(int groupPosition, int childPosition) {
    return drinksList.get(groupPosition).getContent();
     listHashMap.get(listDataHeader.get(groupPosition)).get(childPosition);
}

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

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

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



@Override
public View getGroupView(final int groupPosition, boolean isExpanded, View view, ViewGroup parent) {
    String headerTitle = (String) drinksList.get(groupPosition).getTitle();

    /** HEADER TEXT HERE */



    if(view==null) {
        LayoutInflater inflater = (LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.vip_package_listgroup,null);
    }
    final LinearLayout bgcolor = view.findViewById(R.id.lblListHeaderLayout);
    TextView lblListHeader = (TextView)view.findViewById(R.id.lblListHeader);
    TextView lblListHeaderPrice = (TextView)view.findViewById(R.id.lblListHeader_Price);
    Button lblListHeaderButton = view.findViewById(R.id.lblListHeaderButton);

    lblListHeaderPrice.setVisibility(View.GONE);
    lblListHeaderButton.setVisibility(View.GONE);

    if(!drinksList.get(groupPosition).getBg().get(0).isEmpty() || !drinksList.get(groupPosition).getBg().get(1).isEmpty() ) {

        List<String> colorGradientTopBottom = drinksList.get(groupPosition).getBg();

        int[] colors = {Color.parseColor(colorGradientTopBottom.get(0)),Color.parseColor(colorGradientTopBottom.get(1))};
        GradientDrawable gd = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, colors);
        gd.setCornerRadius(0f);
        bgcolor.setBackground(gd);
    } else {

        bgcolor.setBackgroundColor(ContextCompat.getColor(context, R.color.cardview_bg));
    }

    lblListHeader.setText(headerTitle);

    return view;

}

@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View view, ViewGroup parent) {

    /** Drinks List */
    final ViewHolder viewHolder;

    final List<String> childDrink = drinksList.get(groupPosition).getContent();
    final List<Integer> childPrice = drinksList.get(groupPosition).getPricelist();
    //final String childText =  childDrink.get(childPosition);

    if(view == null) {
        LayoutInflater inflater = (LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.vip_drinks_listitem,null);

        final TextView txtListChild = view.findViewById(R.id.lblListItemDrinks);
        final TextView txtListDrinksUnitPrice = view.findViewById(R.id.lblListItemDrinksUnitPrice);
        final TextView txtDrinksAmount = view.findViewById(R.id.vip_drinks_amount);
        final TextView txtListDrinkPriceFinal = view.findViewById(R.id.lblListItemDrinksFinalPrice);
        Button btn_plus = view.findViewById(R.id.vip_drinks_btn_plus);
        Button btn_minus = view.findViewById(R.id.vip_drinks_btn_minus);

        viewHolder = new ViewHolder();
        viewHolder.childText = txtListChild;
        viewHolder.childUnitPrice = txtListDrinksUnitPrice;
        viewHolder.counterText = txtDrinksAmount;
        viewHolder.childFinalPrice = txtListDrinkPriceFinal;
        viewHolder.btn_plus = btn_plus;
        viewHolder.btn_minus = btn_minus;


        viewHolder.childText.setText(childDrink.get(childPosition));
        viewHolder.counterText.setText("0");
        viewHolder.childFinalPrice.setText("0");
        final float headerPrice = childPrice.get(childPosition);
        final int headerPriceInt = (int) headerPrice;
        viewHolder.childUnitPrice.setText(String.format("%.02f",headerPrice).replace(".",",") +"€");

        DrinksListChildItem child = childDrink.get(childPosition);


        viewHolder.btn_plus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                int t = Integer.parseInt(viewHolder.counterText.getText().toString());
                ChildItem selectedItem = viewHolder.counterText.getText().toString();
                selectedItem.quantity = selectedItem.quantity+1;
                notifyDataSetChanged();

                viewHolder.counterText.setText(String.valueOf(t + 1));
                viewHolder.childFinalPrice.setText(String.valueOf((t+1)* headerPriceInt) + "€");
            }
        });



        viewHolder.btn_minus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Pos pos = (Pos) v.getTag();
                int t = Integer.parseInt(viewHolder.counterText.getText().toString());
                DrinksListChildItem selectedItem = (DrinksListChildItem) getChild(pos.group,pos.child);
                selectedItem.quantity = selectedItem.quantity-1;
                notifyDataSetChanged();
                viewHolder.counterText.setText(String.valueOf(t - 1));
                viewHolder.counterText.setText(String.valueOf((t-1)* headerPriceInt) + "€");
            }
        });


    } else {
        viewHolder = (ViewHolder) view.getTag();
    }


    return view;
以下是包含解析请求的活动:

public class drinks_selection extends AppCompatActivity {


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

        final ExpandableListView listView = findViewById(R.id.vip_drinks_listview);


        /** PARSING JSON FROM SERVER */

        final JsonObjectRequest galleryUrls = new JsonObjectRequest(Request.Method.GET, PARSE_URL, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                try {
                    JSONArray packageArray = response.getJSONArray("drinks");
                    Log.e("response", String.valueOf(response));
                    GsonBuilder gsonBuilder = new GsonBuilder();
                    Gson gson = gsonBuilder.create();
                    List<Drink> vipDrinks = Arrays.asList(gson.fromJson(String.valueOf(packageArray),Drink[].class));
                    List<Drink> arrayList = new ArrayList<>(vipDrinks);

                    ExpandableListAdapterDrinks listAdapter = new ExpandableListAdapterDrinks(getApplicationContext(),arrayList);
                    listView.setAdapter( listAdapter);
                    listView.expandGroup(0);

                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {


                Log.e("ERROR", String.valueOf(error));
            }
        });

        RequestQueue rQ = Volley.newRequestQueue(this);
        rQ.add(galleryUrls);

    }
}
VIP套餐列表组.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:id="@+id/lblListHeaderLayout"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="@dimen/default_padding"
    android:background="@drawable/bg_vip_booking"
    android:orientation="horizontal"

    >

<RelativeLayout

    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:paddingStart="?android:attr/expandableListPreferredItemPaddingLeft"
    android:paddingEnd="@dimen/feed_item_padding_left_right"
    android:layout_weight="0.9"
    >

    <TextView
        android:id="@+id/lblListHeader"
        android:textSize="@dimen/text_title_list_header"
        android:textColor="@color/Textwhite"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="@font/mont_bold"

        />

    <TextView
        android:id="@+id/lblListHeader_Price"
        android:textSize="@dimen/text_title_list_header"
        android:textColor="@color/Textwhite"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:fontFamily="@font/mont_bold"

        />
</RelativeLayout>

    <Button
        android:id="@+id/lblListHeaderButton"
        android:layout_width="60dp"
        android:layout_height="30dp"
        android:background="@drawable/bg_btn_ripple_dark"
        android:text="@string/btn_ok"
        android:textColor="@color/Textwhite"
        android:fontFamily="@font/mont_bold"
        android:focusable="false"

        />

</LinearLayout>
VIP饮料列表项.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="60dip"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_centerInParent="true"

    >


    <TextView
        android:id="@+id/lblListItemDrinks"
        android:paddingTop="@dimen/padding_small"
        android:paddingBottom="@dimen/padding_small"
        android:textSize="@dimen/text_normal"
        android:paddingLeft="@dimen/default_padding"
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:fontFamily="@font/mont_medium"
        android:textColor="@color/Textwhite"
        app:layout_constraintStart_toStartOf="parent"


        />



    <RelativeLayout
        android:id="@+id/vip_drinks_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toEndOf="@id/lblListItemDrinks"
        android:paddingStart="@dimen/default_padding"
        android:layout_centerInParent="true"
        android:paddingEnd="@dimen/default_padding"
        app:layout_constraintEnd_toEndOf="parent"



        >

        <TextView
            android:id="@+id/lblListItemDrinksUnitPrice"
            android:textSize="@dimen/text_normal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:fontFamily="@font/mont_light"
            android:textColor="@color/Textwhite"
            android:paddingEnd="@dimen/padding_small"
            />

        <Button
            android:id="@+id/vip_drinks_btn_minus"
            android:layout_toEndOf="@id/lblListItemDrinksUnitPrice"

            android:layout_width="30dp"
            android:layout_height="20dp"
            android:text="-"

            android:background="@drawable/bg_btn_ripple_dark"
            android:textColor="@color/white"
            android:textSize="14sp"
            android:layout_marginEnd="@dimen/padding_small"

            />


        <TextView
            android:id="@+id/vip_drinks_amount"
            android:layout_toEndOf="@+id/vip_drinks_btn_minus"


            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/white"
            android:fontFamily="@font/mont_light"
            android:textSize="@dimen/text_normal"
            android:layout_marginEnd="@dimen/padding_small"
            />


        <Button
            android:id="@+id/vip_drinks_btn_plus"
            android:layout_toEndOf="@+id/vip_drinks_amount"

            android:layout_width="30dp"
            android:layout_height="20dp"
            android:text="+"
            android:background="@drawable/bg_btn_ripple_dark"
            android:textColor="@color/white"
            android:textSize="14sp"
            android:layout_marginEnd="@dimen/padding_small"

            />


        <TextView
            android:id="@+id/lblListItemDrinksFinalPrice"
            android:layout_toEndOf="@id/vip_drinks_btn_plus"
            android:textSize="@dimen/text_normal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:fontFamily="@font/mont_light"
            android:textColor="@color/Textwhite"

            />
    </RelativeLayout>

</androidx.constraintlayout.widget.ConstraintLayout>
添加一个新的类SelectedDrink,如下所示:

public class SelectedDrink {
String content;
int qty;
}
然后尝试以下适配器代码:

public class ExpandableListAdapterDrinks extends BaseExpandableListAdapter {

private Context context;
private List<Drink> drinksList;

private Button btReset, btOk;
private List<Integer> groupSum;
private List<List<Integer>> qty;
private int totalSum = 0;

class ViewHolder {
    TextView childText,counterText, childUnitPrice, childFinalPrice;
    Button btn_plus,btn_minus;
}

class Pos{
    int group;
    int child;
    Pos(int group, int child){
        this.group = group;
        this.child = child;
    }
}

public ExpandableListAdapterDrinks(Context context, List<Drink> drinksList,
                                   Button btReset, Button btOk) {
    this.context = context;
    this.drinksList= drinksList;
    this.btReset = btReset;
    this.btOk = btOk;

    groupSum = new ArrayList<>();
    qty = new ArrayList<>();
    for(int i=0; i<drinksList.size(); i++) {
        groupSum.add(0);
        List<Integer> orderedQty = new ArrayList<>();
        for(int j=0; j<drinksList.get(i).getContent().size(); j++) orderedQty.add(0);
        qty.add(orderedQty);
    }
}

private void resetGroupSum(int groupPosition) {
    totalSum -= groupSum.get(groupPosition);
    groupSum.set(groupPosition, 0);
    resetGroupChildrenQty(groupPosition);
}

private void resetGroupChildrenQty(int groupPosition) {
    for(int i=0; i<qty.get(groupPosition).size(); i++) qty.get(groupPosition).set(i, 0);
}

@Override
public int getGroupCount() {
    return drinksList.size();
}

@Override
public int getChildrenCount(int groupPosition) {
    return drinksList.get(groupPosition).getContent().size();
}

@Override
public Drink getGroup(int groupPosition) {
    return drinksList.get(groupPosition);
}

@Override
public String getChild(int groupPosition, int childPosition) {
    return drinksList.get(groupPosition).getContent().get(childPosition);
}

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

@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 view, ViewGroup parent) {
    String headerTitle = drinksList.get(groupPosition).getTitle();

    /** HEADER TEXT HERE */
    if(view==null) {
        LayoutInflater inflater = (LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.vip_package_listgroup,null);
    }
    LinearLayout bgcolor = view.findViewById(R.id.lblListHeaderLayout);
    TextView lblListHeader = (TextView)view.findViewById(R.id.lblListHeader);
    TextView lblListHeaderPrice = (TextView)view.findViewById(R.id.lblListHeader_Price);
    Button lblListHeaderButton = view.findViewById(R.id.lblListHeaderButton);

    if(groupSum.get(groupPosition) > 0){
        lblListHeaderPrice.setVisibility(View.VISIBLE);
        lblListHeaderPrice.setText(String.format("%.02f", (float)groupSum.get(groupPosition)).replace(".", ",") + "€");
    }else{
        lblListHeaderPrice.setVisibility(View.GONE);
        lblListHeaderButton.setVisibility(View.GONE);
    }

    if(!drinksList.get(groupPosition).getBg().get(0).isEmpty() || !drinksList.get(groupPosition).getBg().get(1).isEmpty() ) {
        List<String> colorGradientTopBottom = drinksList.get(groupPosition).getBg();
        int[] colors = {Color.parseColor(colorGradientTopBottom.get(0)),Color.parseColor(colorGradientTopBottom.get(1))};
        GradientDrawable gd = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, colors);
        gd.setCornerRadius(0f);
        bgcolor.setBackground(gd);
    } else {
        //bgcolor.setBackgroundColor(ContextCompat.getColor(context, R.color.cardview_bg));
    }
    lblListHeader.setText(headerTitle);

    return view;
}

@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View view, ViewGroup parent) {

    /** Drinks List */
    ViewHolder viewHolder;

    String childDrink = getChild(groupPosition, childPosition);
    int childPrice = getGroup(groupPosition).getPricelist().get(childPosition);

    if (view == null) {
        LayoutInflater inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.vip_drinks_listitem, null);

        viewHolder = new ViewHolder();
        viewHolder.childText = view.findViewById(R.id.lblListItemDrinks);
        viewHolder.childUnitPrice = view.findViewById(R.id.lblListItemDrinksUnitPrice);
        viewHolder.counterText = view.findViewById(R.id.vip_drinks_amount);
        viewHolder.childFinalPrice = view.findViewById(R.id.lblListItemDrinksFinalPrice);
        viewHolder.btn_plus = view.findViewById(R.id.vip_drinks_btn_plus);
        viewHolder.btn_minus = view.findViewById(R.id.vip_drinks_btn_minus);

        viewHolder.btn_plus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Pos pos = (Pos) v.getTag();
                int orderedQty = qty.get(pos.group).get(pos.child);
                orderedQty++;
                qty.get((pos.group)).set(pos.child, orderedQty);
                groupSum.set(pos.group, groupSum.get(pos.group) + getGroup(pos.group).getPricelist().get(pos.child));
                notifyDataSetChanged();
                totalSum += getGroup(pos.group).getPricelist().get(pos.child);
                btOk.setText(String.format("%.02f", (float)totalSum).replace(".", ",") + "€");
                btReset.setEnabled(true);
            }
        });

        viewHolder.btn_minus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Pos pos = (Pos) v.getTag();
                int orderedQty = qty.get(pos.group).get(pos.child);
                if (orderedQty > 0) {
                    orderedQty--;
                    qty.get((pos.group)).set(pos.child, orderedQty);
                    groupSum.set(pos.group, groupSum.get(pos.group) - getGroup(pos.group).getPricelist().get(pos.child));
                    notifyDataSetChanged();
                    totalSum -= getGroup(pos.group).getPricelist().get(pos.child);
                    if (totalSum == 0) resetTotalSum();
                    else btOk.setText(String.format("%.02f", (float)totalSum).replace(".", ",") + "€");
                }
            }
        });
    } else {
        viewHolder = (ViewHolder) view.getTag();
    }

    viewHolder.childText.setText(childDrink);
    viewHolder.childUnitPrice.setText(String.format("%.02f", (float)childPrice).replace(".", ",") + "€");
    int orderedQty = qty.get(groupPosition).get(childPosition);
    viewHolder.counterText.setText(String.valueOf(orderedQty));
    viewHolder.childFinalPrice.setText(String.format("%.02f", (float)orderedQty*childPrice).replace(".", ",") + "€");

    viewHolder.btn_minus.setTag(new Pos(groupPosition, childPosition));
    viewHolder.btn_plus.setTag(new Pos(groupPosition, childPosition));
    view.setTag(viewHolder);
    return view;
}

@Override
public boolean isChildSelectable(int i, int i1) {
    return false;
}

public void resetTotalSum() {
    for(int i=0; i<drinksList.size(); i++) {
        resetGroupSum(i);
    }
    notifyDataSetChanged();
    btReset.setEnabled(false);
    btOk.setText(String.valueOf(0));
}

public ArrayList<SelectedDrink> getOrderList() {
    ArrayList<SelectedDrink> orderList = new ArrayList<>();
    for(int i=0; i<drinksList.size(); i++) {
        for(int j=0; j<drinksList.get(i).getContent().size(); j++) {
            if(qty.get(i).get(j) > 0) {
                SelectedDrink selectedDrink = new SelectedDrink();
                selectedDrink.content = getGroup(i).getContent().get(j);
                selectedDrink.qty = qty.get(i).get(j);
                orderList.add(selectedDrink);
            }
        }
    }
    return orderList;
}
}
我使用此活动测试上述内容:

public class MainActivity extends AppCompatActivity {
final private static int NUM_OF_GROUP = 5;
List<Drink> drinksList;
ExpandableListView listView;
ExpandableListAdapterDrinks expandableListAdapterDrinks;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button btRest = findViewById(R.id.btReset);
    Button btOk = findViewById(R.id.btOK);
    listView = findViewById(R.id.elvDrinks);

    initDataList();
    expandableListAdapterDrinks =
            new ExpandableListAdapterDrinks(getApplicationContext(), drinksList, btRest, btOk);
    listView.setAdapter(expandableListAdapterDrinks);
    listView.expandGroup(0);

    btRest.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            expandableListAdapterDrinks.resetTotalSum();
            for(int i=0; i<drinksList.size(); i++) listView.collapseGroup(i);
            listView.expandGroup(0);
        }
    });
    btOk.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String msg = "Nothing Selected";
            Button button = (Button)view;
            if(!button.getText().equals("0")) {
                msg = "Upload!\n";
                ArrayList<SelectedDrink> selectedDrinks = expandableListAdapterDrinks.getOrderList();
                for(SelectedDrink selectedDrink: selectedDrinks) {
                    msg += selectedDrink.content + "    " + selectedDrink.qty + "\n";
                }
                msg += "Total: " + button.getText();
            }
            Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
        }
    });
}

private void initDataList(){
    drinksList = new ArrayList<>();
    List<String> content;
    List<Integer> pricelist;
    List<String> bg;
    for(int i=1; i<=NUM_OF_GROUP; i++) {
        content = new ArrayList<>();
        pricelist = new ArrayList<>();
        bg = new ArrayList<>();
        for(int j = 1; j<(NUM_OF_GROUP + new Random().nextInt(5)); j++){
            content.add("Drink " + i + "-" + j);
            pricelist.add(new Random().nextInt(1000));
            bg.add("#008577");
            bg.add("#D81B60");
        }
        Drink drink = new Drink();
        drink.setTitle("Group " + i);
        drink.setContent(content);
        drink.setPricelist(pricelist);
        drink.setBg(bg);
        drinksList.add(drink);
    }
}
}
这个布局:

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

<LinearLayout
    android:id="@+id/llBtns"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:orientation="horizontal">

    <Button
        android:id="@+id/btReset"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:enabled="false"
        android:text="Reset" />

    <Button
        android:id="@+id/btOK"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.5"
        android:text="0" />
</LinearLayout>

<ExpandableListView
    android:id="@+id/elvDrinks"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@id/llBtns">
</ExpandableListView>

</RelativeLayout>

此外,还需要您的饮料类vip\u package\u listgroup.xml和vip\u drinks\u listitem.xml。希望有帮助

由于视图将被重用/回收,因此将数据保留在TextView中是错误的。折叠/展开或滚动后,它们将被啮合。尝试修改您的饮料列表以保留数据。本文中的示例可能会有所帮助:对于“确定”按钮,请尝试在适配器内创建一个公共方法,并获取那些选择的子项,其数量不为0。在我对这篇文章的回答的适配器中查看getOrderList方法:要访问ExpandableListView之外的TextView,请尝试:1。在适配器中,添加TextView全局变量;2.在适配器的构造函数中,为TextView添加一个参数;3.在构造函数中,使TextView全局变量为varible=TextView参数。希望有帮助!查看我的代码更新,无法将您的selectedItem.quantity连接到我的饮料列表,因为您在代码中使用的HashMap在我的代码中丢失。请同时发布饮料类。我添加了vip_package_listgroup.xml和vip_drinks_listitem.xml+Drink.class是Pojo类,你确定你需要POJO课程而不是别的吗?谢谢你的帮助。我应该给你买杯啤酒。我将很快测试代码并返回结果:这工作非常完美!非常感谢。
public class ExpandableListAdapterDrinks extends BaseExpandableListAdapter {

private Context context;
private List<Drink> drinksList;

private Button btReset, btOk;
private List<Integer> groupSum;
private List<List<Integer>> qty;
private int totalSum = 0;

class ViewHolder {
    TextView childText,counterText, childUnitPrice, childFinalPrice;
    Button btn_plus,btn_minus;
}

class Pos{
    int group;
    int child;
    Pos(int group, int child){
        this.group = group;
        this.child = child;
    }
}

public ExpandableListAdapterDrinks(Context context, List<Drink> drinksList,
                                   Button btReset, Button btOk) {
    this.context = context;
    this.drinksList= drinksList;
    this.btReset = btReset;
    this.btOk = btOk;

    groupSum = new ArrayList<>();
    qty = new ArrayList<>();
    for(int i=0; i<drinksList.size(); i++) {
        groupSum.add(0);
        List<Integer> orderedQty = new ArrayList<>();
        for(int j=0; j<drinksList.get(i).getContent().size(); j++) orderedQty.add(0);
        qty.add(orderedQty);
    }
}

private void resetGroupSum(int groupPosition) {
    totalSum -= groupSum.get(groupPosition);
    groupSum.set(groupPosition, 0);
    resetGroupChildrenQty(groupPosition);
}

private void resetGroupChildrenQty(int groupPosition) {
    for(int i=0; i<qty.get(groupPosition).size(); i++) qty.get(groupPosition).set(i, 0);
}

@Override
public int getGroupCount() {
    return drinksList.size();
}

@Override
public int getChildrenCount(int groupPosition) {
    return drinksList.get(groupPosition).getContent().size();
}

@Override
public Drink getGroup(int groupPosition) {
    return drinksList.get(groupPosition);
}

@Override
public String getChild(int groupPosition, int childPosition) {
    return drinksList.get(groupPosition).getContent().get(childPosition);
}

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

@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 view, ViewGroup parent) {
    String headerTitle = drinksList.get(groupPosition).getTitle();

    /** HEADER TEXT HERE */
    if(view==null) {
        LayoutInflater inflater = (LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.vip_package_listgroup,null);
    }
    LinearLayout bgcolor = view.findViewById(R.id.lblListHeaderLayout);
    TextView lblListHeader = (TextView)view.findViewById(R.id.lblListHeader);
    TextView lblListHeaderPrice = (TextView)view.findViewById(R.id.lblListHeader_Price);
    Button lblListHeaderButton = view.findViewById(R.id.lblListHeaderButton);

    if(groupSum.get(groupPosition) > 0){
        lblListHeaderPrice.setVisibility(View.VISIBLE);
        lblListHeaderPrice.setText(String.format("%.02f", (float)groupSum.get(groupPosition)).replace(".", ",") + "€");
    }else{
        lblListHeaderPrice.setVisibility(View.GONE);
        lblListHeaderButton.setVisibility(View.GONE);
    }

    if(!drinksList.get(groupPosition).getBg().get(0).isEmpty() || !drinksList.get(groupPosition).getBg().get(1).isEmpty() ) {
        List<String> colorGradientTopBottom = drinksList.get(groupPosition).getBg();
        int[] colors = {Color.parseColor(colorGradientTopBottom.get(0)),Color.parseColor(colorGradientTopBottom.get(1))};
        GradientDrawable gd = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, colors);
        gd.setCornerRadius(0f);
        bgcolor.setBackground(gd);
    } else {
        //bgcolor.setBackgroundColor(ContextCompat.getColor(context, R.color.cardview_bg));
    }
    lblListHeader.setText(headerTitle);

    return view;
}

@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View view, ViewGroup parent) {

    /** Drinks List */
    ViewHolder viewHolder;

    String childDrink = getChild(groupPosition, childPosition);
    int childPrice = getGroup(groupPosition).getPricelist().get(childPosition);

    if (view == null) {
        LayoutInflater inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        view = inflater.inflate(R.layout.vip_drinks_listitem, null);

        viewHolder = new ViewHolder();
        viewHolder.childText = view.findViewById(R.id.lblListItemDrinks);
        viewHolder.childUnitPrice = view.findViewById(R.id.lblListItemDrinksUnitPrice);
        viewHolder.counterText = view.findViewById(R.id.vip_drinks_amount);
        viewHolder.childFinalPrice = view.findViewById(R.id.lblListItemDrinksFinalPrice);
        viewHolder.btn_plus = view.findViewById(R.id.vip_drinks_btn_plus);
        viewHolder.btn_minus = view.findViewById(R.id.vip_drinks_btn_minus);

        viewHolder.btn_plus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Pos pos = (Pos) v.getTag();
                int orderedQty = qty.get(pos.group).get(pos.child);
                orderedQty++;
                qty.get((pos.group)).set(pos.child, orderedQty);
                groupSum.set(pos.group, groupSum.get(pos.group) + getGroup(pos.group).getPricelist().get(pos.child));
                notifyDataSetChanged();
                totalSum += getGroup(pos.group).getPricelist().get(pos.child);
                btOk.setText(String.format("%.02f", (float)totalSum).replace(".", ",") + "€");
                btReset.setEnabled(true);
            }
        });

        viewHolder.btn_minus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Pos pos = (Pos) v.getTag();
                int orderedQty = qty.get(pos.group).get(pos.child);
                if (orderedQty > 0) {
                    orderedQty--;
                    qty.get((pos.group)).set(pos.child, orderedQty);
                    groupSum.set(pos.group, groupSum.get(pos.group) - getGroup(pos.group).getPricelist().get(pos.child));
                    notifyDataSetChanged();
                    totalSum -= getGroup(pos.group).getPricelist().get(pos.child);
                    if (totalSum == 0) resetTotalSum();
                    else btOk.setText(String.format("%.02f", (float)totalSum).replace(".", ",") + "€");
                }
            }
        });
    } else {
        viewHolder = (ViewHolder) view.getTag();
    }

    viewHolder.childText.setText(childDrink);
    viewHolder.childUnitPrice.setText(String.format("%.02f", (float)childPrice).replace(".", ",") + "€");
    int orderedQty = qty.get(groupPosition).get(childPosition);
    viewHolder.counterText.setText(String.valueOf(orderedQty));
    viewHolder.childFinalPrice.setText(String.format("%.02f", (float)orderedQty*childPrice).replace(".", ",") + "€");

    viewHolder.btn_minus.setTag(new Pos(groupPosition, childPosition));
    viewHolder.btn_plus.setTag(new Pos(groupPosition, childPosition));
    view.setTag(viewHolder);
    return view;
}

@Override
public boolean isChildSelectable(int i, int i1) {
    return false;
}

public void resetTotalSum() {
    for(int i=0; i<drinksList.size(); i++) {
        resetGroupSum(i);
    }
    notifyDataSetChanged();
    btReset.setEnabled(false);
    btOk.setText(String.valueOf(0));
}

public ArrayList<SelectedDrink> getOrderList() {
    ArrayList<SelectedDrink> orderList = new ArrayList<>();
    for(int i=0; i<drinksList.size(); i++) {
        for(int j=0; j<drinksList.get(i).getContent().size(); j++) {
            if(qty.get(i).get(j) > 0) {
                SelectedDrink selectedDrink = new SelectedDrink();
                selectedDrink.content = getGroup(i).getContent().get(j);
                selectedDrink.qty = qty.get(i).get(j);
                orderList.add(selectedDrink);
            }
        }
    }
    return orderList;
}
}
public class MainActivity extends AppCompatActivity {
final private static int NUM_OF_GROUP = 5;
List<Drink> drinksList;
ExpandableListView listView;
ExpandableListAdapterDrinks expandableListAdapterDrinks;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button btRest = findViewById(R.id.btReset);
    Button btOk = findViewById(R.id.btOK);
    listView = findViewById(R.id.elvDrinks);

    initDataList();
    expandableListAdapterDrinks =
            new ExpandableListAdapterDrinks(getApplicationContext(), drinksList, btRest, btOk);
    listView.setAdapter(expandableListAdapterDrinks);
    listView.expandGroup(0);

    btRest.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            expandableListAdapterDrinks.resetTotalSum();
            for(int i=0; i<drinksList.size(); i++) listView.collapseGroup(i);
            listView.expandGroup(0);
        }
    });
    btOk.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String msg = "Nothing Selected";
            Button button = (Button)view;
            if(!button.getText().equals("0")) {
                msg = "Upload!\n";
                ArrayList<SelectedDrink> selectedDrinks = expandableListAdapterDrinks.getOrderList();
                for(SelectedDrink selectedDrink: selectedDrinks) {
                    msg += selectedDrink.content + "    " + selectedDrink.qty + "\n";
                }
                msg += "Total: " + button.getText();
            }
            Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
        }
    });
}

private void initDataList(){
    drinksList = new ArrayList<>();
    List<String> content;
    List<Integer> pricelist;
    List<String> bg;
    for(int i=1; i<=NUM_OF_GROUP; i++) {
        content = new ArrayList<>();
        pricelist = new ArrayList<>();
        bg = new ArrayList<>();
        for(int j = 1; j<(NUM_OF_GROUP + new Random().nextInt(5)); j++){
            content.add("Drink " + i + "-" + j);
            pricelist.add(new Random().nextInt(1000));
            bg.add("#008577");
            bg.add("#D81B60");
        }
        Drink drink = new Drink();
        drink.setTitle("Group " + i);
        drink.setContent(content);
        drink.setPricelist(pricelist);
        drink.setBg(bg);
        drinksList.add(drink);
    }
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<LinearLayout
    android:id="@+id/llBtns"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:orientation="horizontal">

    <Button
        android:id="@+id/btReset"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:enabled="false"
        android:text="Reset" />

    <Button
        android:id="@+id/btOK"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.5"
        android:text="0" />
</LinearLayout>

<ExpandableListView
    android:id="@+id/elvDrinks"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_above="@id/llBtns">
</ExpandableListView>

</RelativeLayout>