使用EditText

时间:2017-11-03 08:04:15

标签: android listview

滚动时,我在扩展listview中遇到问题,edittext值发生了变化。我试图将值存储在模态类中,并在查看create.But Edittext值的同时设置该值,同时滚动。请建议任何解决方案。这是我的代码for expandable listview。给我一些提示或我在这段代码中出错的地方。

以下是来自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;
        }
    }

2 个答案:

答案 0 :(得分:0)

滚动时

,edittext值更改。这是android中列表容器的属性(列表视图或回收站视图)。您的数据将在滚动后回收。因此,如果您需要维护视图的状态,只需在数据集内保存即可。  例如:在您的情况下,您需要在滚动期间维护以前键入的文本。

 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) {
        if(!TextUtils.isEmpty(charSequence.toString())){
            childText.setValue(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) {
    }
});

然后为返回的每个新子项设置以前保存的文本:

 public View getChildView(final int groupPosition, final int childPosition,
                         boolean isLastChild, View convertView, ViewGroup parent) {
    et_Search.setText(dataset.get(position).Val);
}

在版本Edittext中,每个列表项都是错误的设计实践。我建议你想出更好的UI设计。例如,您可以在列表项上有一个按钮,单击按钮可以在对话框的帮助下进行输入,也可以保存以前的状态。阅读This

答案 1 :(得分:0)

在对onchildView()进行调试和分析后,我找到了有效的解决方案.. 我为商店父母和子视图创建了视图持有者

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的视图。如果视图为null我将视图设置为hashmap,而其他人则从我存储的hashmap中获取视图。希望其他面向此问题的开发人员获得帮助从这个答案。祝你有个美好的一天..

@覆盖

    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;
        }





    }