RecyclerView里如果有edittext,并且改变edittext的内容的时候不做处理的话,滑动RecyclerView之后数据混乱。
一下方法亲测可用
1.初始化adapter
LinearLayoutManager layoutManager = new LinearLayoutManager(mRootView.getActivity()); recyclerView = mRootView.getRecyclerView(); recyclerView.setLayoutManager(layoutManager); recyclerView.setNestedScrollingEnabled(false); //绑定 adapter.bindToRecyclerView(recyclerView); recyclerView.setAdapter(adapter);
2.编写adapter
adapter 我是用https://www.jianshu.com/p/b343fcff51b0/ 这个组件做的。具体用法可参看文章
以下划重点
原理就是在convert 给edit加上addTextChangedListener,如果需要edit背景的一些处理还可以加setOnFocusChangeListener,在逻辑代码最后加上以下两行,关闭item的复用
helper.setIsRecyclable(false);
helper.setTag(R.id.rl_test, item);
具体代码
@Override protected void convert(BaseViewHolder helper, Target.TargetListBean item) { EditText editTextWeek = helper.getView(R.id.tv_number_week); editTextWeek.setText(item.getTargetPerWeek() != 0 ? item.getTargetPerWeek() + "" : ""); setEditTextFocusChangeListener(editTextWeek, helper.getAdapterPosition()); helper.setIsRecyclable(false); helper.setTag(R.id.rl_test, item); }
private void setEditTextFocusChangeListener(EditText editText, int adapterPosition) { editText.setOnFocusChangeListener((v, hasFocus) -> { String string = editText.getText().toString(); boolean isNull = StringUtil.isNull(string); if (hasFocus) { //延迟30mm 光标移动到输入框最后 new Handler().postDelayed(() -> editText.setSelection(string.length()), 30); setEditBg(editText, false);//改变背景的方法 } else { setEditBg(editText, isNull); } }); editText.addTextChangedListener(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) { String edit = editText.getText().toString(); //这里把页面上输入的数据set进数据源,进行数据刷新,现在你上下滑动数据应该是没问题 data.get(adapterPosition).setTargetPerWeek(value); } }); }
在activity页面直接可以使用adapter.getData()获取最新的数据 不需要再去遍历view获取值