【问题标题】:Expandable Listview with EditText带有 EditText 的可扩展列表视图
【发布时间】:2017-11-03 08:04:14
【问题描述】:

滚动时我在可扩展列表视图中遇到问题,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;
        }
    }

【问题讨论】:

  • 在 getGroupView 中。您需要获取 groupview 对象并将文本设置为它而不是直接 convertview ?
  • 不工作..请给出一些有效的答案..editext分配给多个edittext。滚动时在其他edittext中反映相同的值
  • @Amod Gokhale 我在子视图中有编辑文本。那么如何在滚动时进行管理?
  • 我认为添加 groupView 应该可以解决您的问题,但如果不是,您可能想尝试本教程并将您的代码与它进行比较 vogella.com/tutorials/AndroidListView/…

标签: android listview


【解决方案1】:

在对 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);


        }
    }

以及从 hashmap 存储和检索视图的 setter 和 getter 方法。如果视图为 null,我将视图设置为 hashmap,否则从我存储的 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;
        }





    }

【讨论】:

    【解决方案2】:

    在滚动时,edittext 值会发生变化。这是 android(List view or recycler View) 中列表容器的属性。您的数据将在滚动后回收。因此,如果您需要维护视图的状态,只需保存在数据集中即可。 例如:在您的情况下,您需要在滚动期间维护先前键入的文本。

     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

    【讨论】:

    • 不工作..我必须采取哪个位置孩子或父母?
    • 很明显你的编辑文本在哪里。并在您的 ProChild(仅当编辑文本在子视图中)项目中设置值
    • 编辑了我的答案。它可能不是完整的逻辑解决方案。但你会明白的。
    • 我已经按照你所说的在 ProChild 中设置值(编辑文本在子视图中)但是值会发生变化。任何想法。?
    • 在 OnChild() 中打印日志,看看发生了什么。也请参阅更新的答案。
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多