前几天需要实现一个商品订单评论功能,订单中有多个商品,使用了ListView来展示,item效果如下:
为了记录每个商品的评价信息,创建了一个Bean类用于保存用户评价,在适配器中为EditText添加文本监听器,在文本改变的时候保存bean中:
当测试时发现,当前EditText输入文本后滑动列表,发现上下有其他的EditText中也显示相同的文本内容。通过在文本监听器的几个回调方法中打印Log发现,打印出的position不止当前编辑的EditText位置,原因是有多个EditText获取了焦点,同时都处于文本监听状态。于是在代码中加了这么一句:IndentCommentItem commentItem = mComment.get(position);holder.mEtComment.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) { IndentCommentItem commentItem = (IndentCommentItem) holder.mEtComment.getTag(); commentItem.setComment(s.toString()); } @Override public void afterTextChanged(Editable s) { }});holder.mEtComment.setTag(commentItem);//将bean与EditText进行绑定
holder.mEtComment.clearFocus();将EditText的焦点清除,这时又出现一个问题,点击EditText之后怎么输入都不显示,获取不到焦点了,这时通过为EditText添加触摸事件来记录当前点击的位置:
holder.mEtComment.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { index = position; } return false; } });修改清除焦点部分的代码:
if (index == position) { holder.mEtComment.requestFocus(); } else { holder.mEtComment.clearFocus(); }点击EditText是软键盘弹出会导致Item的重绘,若此时出现EditText内容消失,检查bean是否与EditText绑定,并在文本监听其中取出并设置值。
在AndroidManifest中为Activity添加软键盘模式:
android:windowSoftInputMode="stateAlwaysHidden|adjustPan"评分数据的保存于EditText一致,将bean跟控件绑定,为控件添加OnRatingBarChangeListener,并在回调方法中为bean设置值。