我在滚动时可扩展列表视图中有问题,edittext值更改。我试图将值存储在模式类中,并在视图创建时设置该值。但是Edittext值在滚动时更改。请提出任何解决方案。这是我的可扩展列表视图代码。给我一些提示或我在此代码中出错的地方。

以下是我来自android studio的日志

11-04 14:31:59.826 3632-3632 / com.codefuelindia.healthcircleordermgmt E / edittext:-:android.support.design.widget.TextInputEditText {48bc9e8 VFED..CL。 ........ 0,0-514,118#7f080061 app:id / edtQty} Pos0
11-04 14:32:04.862 3632-3632 / com.codefuelindia.healthcircleordermgmt E / edittext:-:android.support.design.widget.TextInputEditText {a67b858 VFED..CL。 ........ 0,0-514,118#7f080061 app:id / edtQty} Pos4
11-04 14:32:04.911 3632-3632 / com.codefuelindia.healthcircleordermgmt E / edittext:-:android.support.design.widget.TextInputEditText {48bc9e8 VFED..CL。 ...... ID 0,0-514,118#7f080061 app:id / edtQty} Pos5
11-04 14:32:04.932 3632-3632 / com.codefuelindia.healthcircleordermgmt E / edittext:-:android.support.design.widget.TextInputEditText {39f8d9c VFED..CL。 ........ 0,0-514,118#7f080061 app:id / edtQty} Pos6
11-04 14:32:05.681 3632-3632 / com.codefuelindia.healthcircleordermgmt E / edittext:-:android.support.design.widget.TextInputEditText {d8d264 VFED..CL。 ........ 0,0-514,118#7f080061 app:id / edtQty} Pos3
11-04 14:32:05.738 3632-3632 / com.codefuelindia.healthcircleordermgmt E / edittext:-:android.support.design.widget.TextInputEditText {bd81fa0 VFED..CL。 ........ 0,0-514,118#7f080061 app:id / edtQty} Pos2
11-04 14:32:05.815 3632-3632 / com.codefuelindia.healthcircleordermgmt E / edittext:-:android.support.design.widget.TextInputEditText {39f8d9c VFED..CL。 ........ 0,0-514,118#7f080061 app:id / edtQty} Pos1
11-04 14:32:05.879 3632-3632 / com.codefuelindia.healthcircleordermgmt E / edittext:-:android.support.design.widget.TextInputEditText {48bc9e8 VFED..CL。 ........ 0,0-514,118#7f080061 app:id / edtQty} Pos0
11-04 14:32:06.201 3632-3632 / com.codefuelindia.healthcircleordermgmt E / edittext:-:android.support.design.widget.TextInputEditText {a67b858 VFED..CL。 ........ 0,0-514,118#7f080061 app:id / edtQty} Pos4
11-04 14:32:06.235 3632-3632 / com.codefuelindia.healthcircleordermgmt E / edittext:-:android.support.design.widget.TextInputEditText {39f8d9c VFED..CL。 ........ 0,0-514,118#7f080061 app:id / edtQty} Pos5
11-04 14:32:06.289 3632-3632 / com.codefuelindia.healthcircleordermgmt E / edittext:-:android.support.design.widget.TextInputEditText {48bc9e8 VFED..CL。 ...... ID 0,0-514,118#7f080061 app:id / edtQty} Pos6

edittext参考重复。如何解决?

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

    import android.content.Context;
    import android.graphics.Typeface;
    import android.support.design.widget.TextInputEditText;
    import android.text.Editable;
    import android.text.TextWatcher;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseExpandableListAdapter;
    import android.widget.TextView;

    import com.codefuelindia.healthcircleordermgmt.R;
    import com.codefuelindia.healthcircleordermgmt.model.CatMaster;
    import com.codefuelindia.healthcircleordermgmt.model.ProChild;

    public class ExpandableListAdapter extends BaseExpandableListAdapter {

        private Context _context;
        private ArrayList<CatMaster> _listDataHeader; // header titles
        // child data in format of header title, child title
        private HashMap<CatMaster, ArrayList<ProChild>> _listDataChild;

        public ExpandableListAdapter(Context context, ArrayList<CatMaster> listDataHeader,
                HashMap<CatMaster, ArrayList<ProChild>> listChildData) {
            this._context = context;
            this._listDataHeader = listDataHeader;
            this._listDataChild = listChildData;
        }

        @Override
        public Object getChild(int groupPosition, int childPosititon) {
            return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                    .get(childPosititon);
        }

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

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

            final ProChild childText = (ProChild) 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 txtListChild = (TextView) convertView
                    .findViewById(R.id.lblListItem);


             TextView tvUnitPrice;
             final TextInputEditText edtQty;
             final TextView tvTotalPrice;

            tvUnitPrice = (TextView) convertView.findViewById(R.id.tvUnitPrice);
            edtQty = (TextInputEditText) convertView.findViewById(R.id.edtQty);
            edtQty.setText();
            tvTotalPrice = (TextView) convertView.findViewById(R.id.tvTotalPrice);

            txtListChild.setText(childText.getName());
            tvUnitPrice.setText(childText.getPrice());
            edtQty.setText(childText.getQty());

            edtQty.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                }

                @Override
                public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

f(!TextUtils.isEmpty(charSequence.toString())){
                    childText.setQty(charSequence.toString());

                   final double total=Double.parseDouble(childText.getPrice())*Integer.parseInt(charSequence.toString());
                    tvTotalPrice.setText("Total: ".concat(String.valueOf(total)));
                }
                else {
                    tvTotalPrice.setText("");

                }

                }

                @Override
                public void afterTextChanged(Editable editable) {



                }
            });


            return convertView;
        }

        @Override
        public int getChildrenCount(int groupPosition) {
            return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                    .size();
        }

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

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

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

        @Override
        public View getGroupView(int groupPosition, boolean isExpanded,
                View convertView, ViewGroup parent) {
            CatMaster headerTitle = (CatMaster) getGroup(groupPosition);
            if (convertView == null) {
                LayoutInflater infalInflater = (LayoutInflater) this._context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = infalInflater.inflate(R.layout.list_group, null);
            }

            TextView lblListHeader = (TextView) convertView
                    .findViewById(R.id.lblListHeader);
            lblListHeader.setTypeface(null, Typeface.BOLD);
            lblListHeader.setText(headerTitle.getCatName());

            return convertView;
        }

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

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

最佳答案

在调试和分析onchildView()之后,我发现了可行的解决方案。
我已经为商店的父视图和子视图创建了Viewholder

class ViewHolder {
//Log.e("text view",txtListChild.toString());
        TextView lblListHeader;
        HashMap<Integer, HashMap<Integer, View>> multiHash = new HashMap<>();
        HashMap<Integer, View> innerHashMap;


        public ViewHolder(View v) {
            innerHashMap = new HashMap<>();
            lblListHeader = v.
                    findViewById(R.id.lblListHeader);


        }

        public View getInnerView(int pos, int groupPos) {
            return multiHash.get(groupPos).get(pos);
        }


//        lblListHeader.setTypeface(null, Typeface.BOLD);
//        lblListHeader.setText(headerTitle.getCatName());

        public void setInnerView(int pos, int groupPos, View innerView) {

            innerHashMap.put(pos, innerView);
            multiHash.put(groupPos, innerHashMap);


        }
    }


和setter和getter方法来存储和检索hashmap中的视图。如果view为null,则将视图设置为hashmap,othervise从存储的hashmap中获取视图。希望遇到此问题的其他开发人员可以从此答案中获取帮助。美好的一天..

@Override

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

        final ProChild childText = (ProChild) getChild(groupPosition, childPosition);
        View myConvertView = convertView;


        // Log.e("quantity:- ",childText.getQty().concat(String.valueOf(childPosition)));
        final TextInputEditText textInputEditText;

        if (convertView == null || !isLastChild || childPosition==this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .size()-1) {

            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_item, null);
            holder.setInnerView(childPosition, groupPosition, convertView);



            TextInputEditText textInputEditText1 = convertView.findViewById(R.id.edtQty);
            TextView tvUnitPrice = convertView.findViewById(R.id.tvUnitPrice);
            final TextView tvTotalPrice = convertView.findViewById(R.id.tvTotalPrice);
            final TextView tvHeader=convertView.findViewById(R.id.lblListItem);

            tvHeader.setText(childText.getName());
            textInputEditText1.setText(childText.getQty());
            tvUnitPrice.setText(childText.getPrice());
            tvTotalPrice.setText( String.valueOf(childText.getTotal()));
            //holder.edtQty.setText(childText.getQty());

//        edtQty.setText(_listDataChild.get(_listDataHeader.get(groupPosition)).get(childPosition).getQty());


            textInputEditText1.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                    //Log.e("child...",""+childPosition);
                }

                @Override
                public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                }

                @Override
                public void afterTextChanged(Editable editable) {
                    grandTotalOf = 0.0;
                    childText.setQty(editable.toString());
//                  _listDataChild.get(_listDataHeader.get(groupPosition)).get(childPosition).setQty(editable.toString());

                    if (!editable.toString().isEmpty() && !editable.toString().equals("0")) {
                        //final double total=Double.parseDouble();

                        final double total = Double.parseDouble(childText.getPrice()) * Integer.parseInt(editable.toString());
                        tvTotalPrice.setText("Total: ".concat(String.valueOf(total)));
                        childText.setTotal(total);

                    } else {
                        tvTotalPrice.setText("");
                        childText.setTotal(0);
                        grandTotal.setGrandTotal(0);

                    }


                    for(int i=0;i<_listDataHeader.size();i++){

                        for(int j=0;j<_listDataChild.get(_listDataHeader.get(i)).size();j++){

                            grandTotalOf=grandTotalOf + _listDataChild.get(_listDataHeader.get(i)).get(j).getTotal();
                        }


                    }


                    grandTotal.setGrandTotal(grandTotalOf);

                }
            });


            return holder.getInnerView(childPosition, groupPosition);

        } else {




            convertView = holder.getInnerView(childPosition, groupPosition);

            if (convertView == null) {
                holder.setInnerView(childPosition, groupPosition, myConvertView);

                convertView = holder.getInnerView(childPosition, groupPosition);
            }


            TextInputEditText textInputEditText1 = convertView.findViewById(R.id.edtQty);
            TextView tvUnitPrice = convertView.findViewById(R.id.tvUnitPrice);
            final TextView tvTotalPrice = convertView.findViewById(R.id.tvTotalPrice);
            final TextView tvHeader=convertView.findViewById(R.id.lblListItem);

          textInputEditText1.setText(childText.getQty());
            tvUnitPrice.setText(childText.getPrice());
            tvHeader.setText(childText.getName());
            tvTotalPrice.setText( String.valueOf(childText.getTotal()));


       edtQty.setText(_listDataChild.get(_listDataHeader.get(groupPosition)).get(childPosition).getQty());


            textInputEditText1.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                    //Log.e("child...",""+childPosition);
                }

                @Override
                public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

                }

                @Override
                public void afterTextChanged(Editable editable) {

                    grandTotalOf=0.0;
                    childText.setQty(editable.toString());
//                  _listDataChild.get(_listDataHeader.get(groupPosition)).get(childPosition).setQty(editable.toString());

                    if (!editable.toString().isEmpty() && !editable.toString().equals("0")) {
                        //final double total=Double.parseDouble();

                        final double total = Double.parseDouble(childText.getPrice()) * Integer.parseInt(editable.toString());
                        tvTotalPrice.setText("Total: ".concat(String.valueOf(total)));
                        childText.setTotal(total);
                        grandTotal.setGrandTotal(total);

                    } else {
                        tvTotalPrice.setText("");
                        childText.setTotal(0);
                        grandTotal.setGrandTotal(0);

                    }


                    for(int i=0;i<_listDataHeader.size();i++){

                        for(int j=0;j<_listDataChild.get(_listDataHeader.get(i)).size();j++){

                            grandTotalOf=grandTotalOf + _listDataChild.get(_listDataHeader.get(i)).get(j).getTotal();
                        }


                    }


                    grandTotal.setGrandTotal(grandTotalOf);

                }
            });

            return convertView;
        }





    }

10-06 02:25