RecyclerView嵌套多个Edittext遇到的一些问题

最近做项目遇到一些小问题,记录一下,做个备忘。需求如下图:

RecyclerView嵌套多个Edittext遇到的一些问题_第1张图片

头部是规格标签,下面列表对应的是各规格的详细数据,上下有一个增删的联动。这个问题不大,主要是下面的RecyclerView嵌套了 Edittext,调试时发现会产生数据混乱的情况。

我一开始是直接在 getView 的时候为 Edittext 绑定了 TextWatcher,并在重写的 afterTextChanged 方法中直接将最终的数据 add 到 list 中。网上查找原因说是系统重新绘制,导致 position 的不准确。这个还不确定,有空儿详细探究一下,解决方法是向外部暴露一个接口,由 Activity 实现这个接口,传入 adapter 并在 afterTextChanged 中调用。

public interface OnItemEditTextChangedListener {
        void onEditTextAfterTextChanged(int id, Editable editable, int position);
    }

   //小数点控制,并在输入完成时存储数据到model中
        final PriceTextWatcher suppluPriceWatcher = new PriceTextWatcher(supplyPrice) {
            @Override
            public void afterTextChanged(Editable s) {
                super.afterTextChanged(s);
                mListener.onEditTextAfterTextChanged(supplyPrice.getId(), s, helper.getLayoutPosition());
                helper.setText(R.id.tv_item_add_specifications_earnings, calculateEarnings(item));
            }
        };

第二个问题是橙黄色的实际收益是要根据输入的两个价格实时计算并显示的,在 Activity 实现的接口 afterTextChanged中,将计算后的数据存储到list中,再执行 notifyDataSetChanged()。这时会报一个错误: java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling。这个具体原因也待研究,解决方法是为Edittext设置一个 OnFocusChangeListener:

   supplyPrice.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    supplyPrice.addTextChangedListener(suppluPriceWatcher);
                } else {
                    supplyPrice.removeTextChangedListener(suppluPriceWatcher);
                }
            }
        });

同时每次输入完毕就调用 notifyDataSetChanged() 会使输入法键盘也刷新,体验极其不好。其实没必要在 afterTextChanged 中调用 notifyDataSetChanged() ,直接调用相应控件显示数据,并将数据存储到 list 中就好。

你可能感兴趣的:(错误解决,Android)