Android recyclerview嵌套多个EditText 请EditText输入上下联动示例

**

需求 recyclerview的item里包含两个EditText 并且 两个控件值得改变可以互相影响(示例里只包含两EditText相关代码)

**
在这里插入图片描述

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;

import org.elastos.wallet.R;
import org.elastos.wallet.ela.base.BaseFragment;
import org.elastos.wallet.ela.ui.vote.bean.VoteListBean;
import org.elastos.wallet.ela.utils.AppUtlis;
import org.elastos.wallet.ela.utils.Log;
import org.elastos.wallet.ela.utils.NumberiUtil;

import java.util.HashMap;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

public class NodeCartAdapter extends RecyclerView.Adapter<NodeCartAdapter.MyViewHolder> {
    private List<VoteListBean.DataBean.ResultBean.ProducersBean> list;
    private Context context;




    private double balance;
    public void setBalance(double balance) {
        this.balance = balance;
    }

    public NodeCartAdapter(List<VoteListBean.DataBean.ResultBean.ProducersBean> list, BaseFragment context) {
        this.context = context.getContext();
        this.list = list;

    }


    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_cr_nodcart, viewGroup, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
   
        holder.etTicketnum.setTag(null);//第一个输入框
        holder.etTicketpercent.setTag(null);;//第二个输入框

        if (holder.etTicketnum.getTag(R.string.ownerpublicKey) != null) {
            TextWatcher textWatcher = (TextWatcher) holder.etTicketnum.getTag(R.string.ownerpublicKey);
            holder.etTicketnum.removeTextChangedListener(textWatcher);
        }
		//因为listener是个数组  也就是可以多个同时监听   为了避免多余的监听,先把以前的移除
        if (holder.etTicketpercent.getTag(R.string.ownerpublicKey) != null) {
            TextWatcher textWatcher = (TextWatcher) holder.etTicketpercent.getTag(R.string.ownerpublicKey);
            holder.etTicketpercent.removeTextChangedListener(textWatcher);

        }
           holder.etTicketnum.setText(null);
            holder.etTicketpercent.setText(null);
        //此处已经没有任何监听 如果为editText写入默认值  可以写在这里  
        addTextChangedListener(holder.etTicketnum, holder.etTicketpercent, position);
        addTextChangedListener(holder.etTicketpercent, holder.etTicketnum, position);
    }


    @Override
    public int getItemCount() {
        return list.size();
    }


    class MyViewHolder extends RecyclerView.ViewHolder {
    
        @BindView(R.id.et_ticketnum)
        EditText etTicketnum;
        @BindView(R.id.et_ticketpercent)
        EditText etTicketpercent;
        MyViewHolder(View view) {
            super(view);
            ButterKnife.bind(this, view);
        }
    }



    private void addTextChangedListener(EditText editText, EditText editText2, int position) {
        if (editText.getTag() != null) {
            editText.setTag(false);
            return;
        }
        TextWatcher textWatcher = 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) {

            }

            @Override
            public void afterTextChanged(Editable s) {
            //拦截因为自己在此方法内修改内容导致的多次触发TextChangedListener(  editText2.setTag(true)标识是方法内改变的不需要再次处理)
                if (editText.getTag() != null && (boolean) editText.getTag()) {
                    editText.setTag(false);//重置防止多次触发的条件
                    return;
                }

                if (TextUtils.isEmpty(s)) {
                    editText2.setTag(true);//防止多次触发TextChangedListener
                    editText2.setText("");
                    dataMapELA.put(position, 0.0);
                    return;
                }
                String input = s.toString().trim();
                try {
                    double inputValue = Double.parseDouble(input);

                    switch (editText.getId()) {
                        case R.id.et_ticketnum:
                            dataMapELA.put(position, inputValue);
                            editText2.setTag(true);
                            editText2.setText(NumberiUtil.numberFormat(inputValue / balance * 100, 2));

                            break;
                        case R.id.et_ticketpercent:
                            dataMapELA.put(position, inputValue / 100 * balance);
                            editText2.setTag(true);
                            editText2.setText(NumberiUtil.numberFormat(inputValue / 100 * balance, 8));

                            break;

                    }
                } catch (Exception e) {
                    dataMapELA.put(position, 0.0);
                    editText.setTag(true);
                    editText2.setTag(true);
                    editText2.setText("");
                    editText.setText("");

                }


            }
        };
        editText.addTextChangedListener(textWatcher);
        editText.setTag(R.string.ownerpublicKey,textWatcher);
    }

}

你可以在RecyclerView的Adapter中为每个EditText设置FocusChange监听器,然后在监听器中处理焦点变化的逻辑。例如,当EditText失去焦点时,可以调用其clearFocus()方法来让其失去焦点。同时,你需要在RecyclerView的Item布局中添加一个可获取焦点的控件,例如一个Button,当用户点击这个Button时,你可以调用RecyclerView的requestFocus()方法来让RecyclerView获取焦点,这样所有的EditText就会失去焦点了。 以下是一个简单的示例代码: ```java public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<String> mData; public MyAdapter(List<String> data) { mData = data; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { holder.mEditText.setText(mData.get(position)); holder.mEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { holder.mEditText.clearFocus(); } } }); holder.mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { holder.itemView.requestFocus(); } }); } @Override public int getItemCount() { return mData.size(); } public static class ViewHolder extends RecyclerView.ViewHolder { public EditText mEditText; public Button mButton; public ViewHolder(@NonNull View itemView) { super(itemView); mEditText = itemView.findViewById(R.id.edit_text); mButton = itemView.findViewById(R.id.button); } } } ``` 在上述代码中,我们为每个EditText设置了FocusChange监听器,并在监听器中处理了焦点变化的逻辑。同时,在Item布局中添加了一个Button,并为其设置了点击事件,当用户点击这个Button时,我们调用RecyclerView的requestFocus()方法来让RecyclerView获取焦点,从而让所有的EditText失去焦点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值