列表(RecyclerView)中EditText实现编辑保存

在列表直接编辑EditText是有点麻烦,直接上写法吧,主要方法在Adapter的onBindViewHolder的方法中,如下:

@Override
    public void onBindViewHolder(@NonNull final MyViewHolder viewHolder, final int position) {
        if (viewHolder.editText.getTag(R.id.editText) instanceof TextWatcher{viewHolder.editText.removeTextChangedListener((TextWatcher)viewHolder.editText.getTag(R.id.editText));}
        
        viewHolder.editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if (actionId == EditorInfo.IME_ACTION_DONE || (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
                    commitQuest();
                    return true;
                }
                return false;
            }
        });
         viewHolder.editText.setOnKeyBoardHideListener(new TextEditTextView.OnKeyBoardHideListener() {
            @Override
            public void onKeyHide(int keyCode, KeyEvent event) {
                LogUtil.i(TAG,"键盘收起来了");
                //监听键盘收起,键盘收起时做网络请求
                if (editFinishListener != null){
                    editFinishListener.editFinish();
                }
            }
        });
        final 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) {
                bean.setContent(s.toString().trim());
                if (onChangeFinishListener != null){
                    //把编辑的内容传出去
                    onChangeFinishListener.onChangeFinish(bean);
                }
            }
        };
        viewHolder.editText.setOnFocusChangeListener(new 
          View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus){
                    viewHolder.editText.addTextChangedListener(textWatcher);
                }else {
                    viewHolder.editText.removeTextChangedListener(textWatcher);
                }
            }
        });
        viewHolder.editText.setTag(R.id.editText,textWatcher);
        viewHolder.rootView.setTag(Integer.parseInt(position + ""));

}

这么写是为了EditText在编辑的时候内容不错乱。

要给所在Activity或Fragment设置两个监听,一个编辑时的监听,把编辑的最新内容传出来,第二要设置键盘收起的监听,做编辑完之后的网络请求。

在Activity或Fragment中重写dispatchTouchEvent方法,做点击编辑框之外区域的监听。代码如下:

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            View v = getCurrentFocus();
            if (isShouldHideInput(v, ev)) {
                //做网络请求
                commitQuest();
            }
            return super.dispatchTouchEvent(ev);
        }
        //必不可少,否则所有的组件都不会有TouchEvent了
        if (getWindow().superDispatchTouchEvent(ev)) {
            return true;
        }
        return onTouchEvent(ev);
    }
    //计算点击区域
    public boolean isShouldHideInput(View v, MotionEvent event) {
        if (v != null && (v instanceof EditText)) {
            int[] leftTop = {0, 0};
            // 获取输入框当前的location位置
            v.getLocationInWindow(leftTop);
            int left = leftTop[0];
            int top = leftTop[1];
            int bottom = top + v.getHeight();
            int right = left + v.getWidth();
            if (event.getX() > left && event.getX() < right
                    && event.getY() > top && event.getY() < bottom) {
                // 点击的是输入框区域,保留点击EditText的事件
                return false;
            } else {
                return true;
            }
        }
        return false;
    }

 实现方法如上,如果对你有用,有帮到你,请点个赞吧!小编也需要鼓励!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值