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

**

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

**
Android recyclerview嵌套多个EditText 请EditText输入上下联动示例_第1张图片

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 {
    private List list;
    private Context context;




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

    public NodeCartAdapter(List 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);
    }

}

你可能感兴趣的:(Android recyclerview嵌套多个EditText 请EditText输入上下联动示例)