在列表直接编辑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;
}
实现方法如上,如果对你有用,有帮到你,请点个赞吧!小编也需要鼓励!