如何将RecyclerView的EditText文本发送到Activity

时间:2018-02-10 15:37:27

标签: android android-adapter

我想从RecyclerView Adapter将EditText的文本值发送到Activity。在我的场景中,我需要在按下按钮时将EditText文本从Adapter发送到Activity(该按钮在Activity类中不在Adapter中)。在这个Adapter类的代码中,

Fabric

我设置了EditText的值。现在我想在点击Button时从此适配器获取此值到Activity类。要点击的按钮是Activity类中的viewHolder.value.setText(memberUpdate.getAmount()); 。请告诉我如何获得EditText的值,它是Adapter类的Activity类。

适配器类:

updateBtn = findViewById(R.id.update_expense_btn);

活动类:

   class AdapterUpdateExpense extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private final int MEMBERUPDATE = 4;
    private List<Object> items;
    private Context context;
    private Activity activity;
    private boolean isEvenlyRadioChecked;
    private Double amount = 0.0;

    AdapterUpdateExpense(Activity activity, Context context, List<Object> items, boolean isEvenlyRadioChecked) {
        this.activity = activity;
        this.context = context;
        this.items = items;
        this.isEvenlyRadioChecked = isEvenlyRadioChecked;
    }

    @Override
    public int getItemViewType(int position) {
        if (items.get(position) instanceof MemberUpdate) {
            return MEMBERUPDATE;
        }
        return -1;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        RecyclerView.ViewHolder holder = null;
        LayoutInflater inflater = LayoutInflater.from(viewGroup.getContext());

        switch (viewType) {
            case MEMBERUPDATE:
                View v4 = inflater.inflate(R.layout.update_expense_layout, viewGroup, false);
                holder = new holderMemberUpdate(v4);
                break;
        }
        return holder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {
        switch (viewHolder.getItemViewType()) {
            case MEMBERUPDATE:
                holderMemberUpdate view4 = (holderMemberUpdate) viewHolder;
                configureHolderMemberUpdate(view4, position);
                break;
        }
    }

    private void configureHolderMemberUpdate(final  holderMemberUpdate viewHolder, final int position) {
        final MemberUpdate memberUpdate = (MemberUpdate) items.get(position);

        if (memberUpdate != null) {
            viewHolder.name.setText(memberUpdate.getTitle());
            viewHolder.value.setText(memberUpdate.getAmount());
        }

        amount+= Double.valueOf(viewHolder.value.getText().toString());
        Log.d("sdfsdfah", getAmount().toString());
    }

    class holderMemberUpdate extends RecyclerView.ViewHolder{
        TextView name;
        EditText value;

        holderMemberUpdate(View view) {
            super(view);
            name = view.findViewById(R.id.member_name_txtview);
            value = view.findViewById(R.id.member_expense_edittxt);

            if(isEvenlyRadioChecked) {
                value.setEnabled(false);
            } else {
                value.setEnabled(true);
                value.setTextColor(context.getResources().getColor(R.color.colorAccent));
            }

        }
    }

2 个答案:

答案 0 :(得分:1)

您最好实现TextChangeListener,因此每当用户编辑编辑文本中的值时,您都可以将新编辑的值存储在List项目中的新变量中,或者存储一个单独的hashamp。

//Hashmap to store edited amount. Is static to access this in Activity class.
    public static HashMap<Integer,String> newAmountHashMap =  new HashMap<Integer, String>();


class holderMemberUpdate extends RecyclerView.ViewHolder{
        TextView name;
        EditText value;

        holderMemberUpdate(View view) {
            super(view);
            name = view.findViewById(R.id.member_name_txtview);
            value = view.findViewById(R.id.member_expense_edittxt);
value.addTextChangedListener(new MyCustomEditTextListener(this));
            if(isEvenlyRadioChecked) {
                value.setEnabled(false);
            } else {
                value.setEnabled(true);
                value.setTextColor(context.getResources().getColor(R.color.colorAccent));
            }

        }
    }

//文本更改侦听器

private class MyCustomEditTextListener implements TextWatcher {
        private int position;

        public void updatePosition(int position) {
            this.position = position;
        }

        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) {
            // no op
        }

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

        }

        @Override
        public void afterTextChanged(Editable editable) {
            newAmountHashMap.put(position, editable.toString());
        }
    }

最后,您应该在Activity中按下按钮处理HashMap。

答案 1 :(得分:1)

你需要一个TextTexts值的TextWatcher,它将设置List<Object> items中对象的值,这不应该只是Object类型,而是至少一些抽象的Member类型使用setAmount方法。

private void configureHolderMemberUpdate(final  holderMemberUpdate viewHolder, final int position) {
    final MemberUpdate memberUpdate = (MemberUpdate) items.get(position);

    if (memberUpdate != null) {
        viewHolder.name.setText(memberUpdate.getTitle());
        viewHolder.value.setText(memberUpdate.getAmount());
    }

    // Add this
    viewHolder.value.addTextChangedListener(... 

在文本观察者中,

items.get(position).setAmount(Double.parseDouble(text));

How to use the TextWatcher class in Android?

然后,编写一个方法来循环items并求和这些值,而不引用任何视图或解析任何内容。

该方法可以写在适配器或活动中,您将列表对象传递给活动