繁体   English   中英

在Android TextWatcher中汇总EditText值

[英]Summing EditText values in an Android TextWatcher

图片

我有一个RecyclerView ,其中的字段是动态创建的。 为了保存存储的数据,我使用了TextWatcher。 但我不知道如何总结EditText -Cost中的值并在屏幕底部的TextView中显示值

public class ItemsAdapter extends
ListAdapter<Item,ItemsAdapter.ViewHolder> {
        private List<Item> mItems=new ArrayList<>();

        public static final DiffUtil.ItemCallback<Item>DIFF_CALLBACK=
                new DiffUtil.ItemCallback<Item>() {
                    @Override
                    public boolean areItemsTheSame( Item oldItem, Item newItem) {
                        return oldItem.getId()==newItem.getId();
                    }

                    @Override
                    public boolean areContentsTheSame(Item oldItem, Item newItem) {
                        return(oldItem.getName()==newItem.getName()&&oldItem.getCost()==newItem.getCost());
                    }
                };

        public ItemsAdapter(){super(DIFF_CALLBACK);}
        public void addMorreItems(List<Item> newItems){
            int insertionPosition=mItems.size();
            mItems.addAll(newItems);
            notifyItemRangeInserted(insertionPosition,newItems.size());
            submitList(mItems);

        }
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
            Context context=parent.getContext();
            LayoutInflater inflater=LayoutInflater.from(context);

            View itemView=inflater.inflate(R.layout.custom_edittext_layout,parent,false);
            ViewHolder viewHolder=new ViewHolder(itemView);
            return viewHolder;

        }
        @Override
        public void onBindViewHolder(ViewHolder viewHolder,int position){
            viewHolder.editTextName.setText(mItems.get(position).getName());
            viewHolder.editTextCost3.setText(mItems.get(position).getCost());

            Item item=getItem(position);
            EditText editText=viewHolder.editTextName;
            editText.setText(item.getName());
            EditText editText1=viewHolder.editTextCost3;
            editText1.setText(item.getCost());
        }


        public class ViewHolder extends RecyclerView.ViewHolder {

            public EditText editTextName;
            public EditText editTextCost3;
            public TextView txtTipAmount3;
            public Button buttonDelete;
            public  Button buttonOK;
            public ViewHolder(View itemView){
                super(itemView);
                editTextCost3=(EditText)itemView.findViewById(R.id.ediCost3);
                editTextName=(EditText)itemView.findViewById(R.id.editTextEnterYourName);
                txtTipAmount3=(TextView)itemView.findViewById(R.id.txtTipAmount3);
                buttonDelete=(Button)itemView.findViewById(R.id.buttonDelete);
                buttonOK=(Button)itemView.findViewById(R.id.buttonOk);

                buttonDelete.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        int position=getAdapterPosition();
                        try {
                            mItems.remove(position);
                            notifyItemRemoved(position);
                        }catch (ArrayIndexOutOfBoundsException e){e.printStackTrace();}
                    }
                });
                editTextName.addTextChangedListener(new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                    }

                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count) {
                        mItems.get(getAdapterPosition()).setmName(editTextName.getText().toString());

                    }

                    @Override
                    public void afterTextChanged(Editable s) {

                    }
                });
                editTextCost3.addTextChangedListener(new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                    }

                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count) {
                        mItems.get(getAdapterPosition()).setmCost(editTextCost3.getText().toString());

                    }

                    @Override
                    public void afterTextChanged(Editable s) {

                    }
                });

            }
        } }
  1. 添加包含TextView的Activity / Fragment回调以获得总和成本:
interface OnCostChangeListener {
  void onChange(List<Item> list);
}
  1. 实施它:
class MyActivity extends AppCompatActivity implements OnCostChangeListener {
//...
  @Override  
  public void onChange(List<Item> list) {
    int sum = 0;
    for (Item it : list) {
      sum += it.getCost();
    }

    ((TextView) findViewById(R.id.totalCost)).setText(String.valueOf(sum));
  }
//...
}
  1. 订阅适配器:
private OnCostChangeListener mListener;
public ItemsAdapter(OnCostChangeListener listener){
  super(DIFF_CALLBACK);
  this.mListener = listener;
}

并在TextWatcher使用监听TextWatcher

editTextCost3.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                }

                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    mItems.get(getAdapterPosition()).setmCost(editTextCost3.getText().toString());
                    if (mListener != null) {
                      mListener.onChange(mItems);
                    }
                }

                @Override
                public void afterTextChanged(Editable s) {

                }
            });

UPD 假设cost存储在Item作为数字(整数,在样本中),而不是字符串

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM