繁体   English   中英

如何将RecyclerView的EditText文本发送到活动

[英]How to send text of RecyclerView's EditText to an Activity

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

viewHolder.value.setText(memberUpdate.getAmount());

我已经设置了EditText的值。 现在,我想在单击Button时从此适配器将其获取到Activity类。 要单击的按钮是updateBtn = findViewById(R.id.update_expense_btn); 在Activity类中。 请告诉我如何获取Adapter类到Activity类的EditText的值。

适配器类别:

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

        }
    }

活动类别:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_update_expense);

        Intent intent = getIntent();
        if (intent.getExtras() != null) {
            receipt = intent.getStringExtra("receipt");
            Log.d("receiptIntent", receipt);
        }


        getReference();


    }

    void getReference() {
updateBtn = findViewById(R.id.update_expense_btn);
        updateBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                memberAmount = ((AdapterUpdateExpense)recyclerView.getAdapter()).getAmount();
                Log.d("memberAmount", memberAmount.toString());
            }
        });
    }

最好实现TextChangeListener,这样,每当用户在编辑文本中编辑值时,都可以将新编辑的值存储在“列表项”中的新变量中,或将其存储在单独的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。

您需要在值EditTexts上使用TextWatcher来设置List<Object> items对象的值,该值实际上不仅应该是Object类型,而且至少应该是一些具有setAmount方法的抽象Member类型。

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

如何在Android中使用TextWatcher类?

然后,编写一种方法来遍历items并汇总这些值 ,而无需引用任何视图或解析任何内容。

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

暂无
暂无

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

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