列表(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;
    }

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

猜你喜欢

转载自blog.csdn.net/qq_30875213/article/details/122437211