ListView包含EditText RatingBar出现的各种问题

本文介绍了一种在Android ListView中处理多个EditText焦点冲突的方法。通过为每个EditText绑定一个Bean类来记录用户输入,并使用触摸事件确保每次只有一个EditText获得焦点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前几天需要实现一个商品订单评论功能,订单中有多个商品,使用了ListView来展示,item效果如下:


为了记录每个商品的评价信息,创建了一个Bean类用于保存用户评价,在适配器中为EditText添加文本监听器,在文本改变的时候保存bean中:

IndentCommentItem commentItem = mComment.get(position);
holder.mEtComment.setTag(commentItem);//将bean与EditText进行绑定

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) { }});
当测试时发现,当前EditText输入文本后滑动列表,发现上下有其他的EditText中也显示相同的文本内容。通过在文本监听器的几个回调方法中打印Log发现,打印出的position不止当前编辑的EditText位置,原因是有多个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设置值。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值