2

1.RecyclerView中的Item中使用CheckBox出现的问题

我们在滑动的时候,其他行的checkbox会莫名地调用setOnCheckedChangeListener,这样我们在滑动的时候,会发现其他行的checkbox会很奇怪勾上,然后滑出界面,又消失了,这个时候,我们需要在RecyclerView.Adapter的onBindViewHolder方法中zholder.cb.setOnCheckedChangeListener(null);将checkbox的监听取消掉,这样就能保证只有是手动切换状态才能发生setOnCheckedChangeListener内部的方法。
具体实现可以看:

    (InvoiceOrderViewHolder holderposition) {
        InvoiceOrderBean bean = mDatas.get(position);
        holder.tvTime.setText(String.format(.getString(R.string.)bean.getCreateTime()));
        holder.cb.setOnCheckedChangeListener(null);
        holder.tvNum.setText(String.format(bean.getTotalNum()));
        holder.tvClick.setOnClickListener(View.OnClickListener() {
           onClick (View v) {
                Intent intent = Intent(PurchaseOrderDetailActivity.);
                intent.putExtra(PurchaseOrderDetailActivity.String.valueOf(.getOrderId()));
                v.getContext().startActivity(intent)}
        });
        holder.cb.setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener() {
        
            (CompoundButton buttonViewisChecked) {
                buttonViewisChecked.setSelect(isChecked)}
        })}

2.RecyclerView中的Item中有EditText,同时我们需要对EditText增加输入监听的情况出现的问题

我们在滑动的时候,其他行的EditText会因为recyclerView的复用View调用addTextChangedListener,这个时候,我们的position不能用,onBindViewHolder的position来获取list中的元素,因为此时的position是不固定的,也就是说list.get(position),这个拿到的object也是不固定的,所以我们需要在addTextChangedListener的afterTextChange方法中重新通过AccountManageBean temp = datas.get(holder.getAdapterPosition());这样能保存temp拿到的值是跟当前的显示的holder是对应的,不然会出现数据紊乱的情况。onBindeViewHolder方法中的实现体:
具体实现可以看:

        AccountManageBean bean = mDatas.get(position);
        holder.tvJob.setText(bean.getJobName());
        holder.tvJob.setTag(bean.getJobCode());
        holder.etName.addTextChangedListener(SimpleTextWatcher() {
            (Editable s) {
                    AccountManageBean temp = mDatas.get(.getAdapterPosition())
                    if(!TextUtils.equals(temp.getName()s.toString())) {
                        temp.setChange(true);
                        temp.setName(s.toString())
                    }
            }
        })}

3.其它方案

在你用了上面的方案,都感觉达不到你的要求,可以屡试不爽的方案,就是,我们在adapter中外部定义一个private SparseBooleanArrayselectedItems; 来进行记录,我们当前点击的是哪一行,这样我们下次滑动的时候,就根据这个来判断,为true的就是你想影响的那一行,其他行的默认false,就不执行就可以了,都不要执行listener的代码就可以了。

4.recyclerView的嵌套问题

在recyclerview23.2.1之前的话,如果我们在ScrollView中嵌套recyclerView,我们需要写LinearLayoutManagerUnScrollable,重写onMeasure方法,然后就计算子view的高度,然后去重新设置recyclerView的高度,但是这个有个问题,就是当recyclerView的高度会动态改变高度,比如我在某个地址列表界面,点击列表上按钮跳转到别的界面,然后选择了新的很长的地址,然后回来到列表界面,刷新,然后recyclerview就显示不全了,超过一行的文字就显示不出来,需要滑动,选择23.2.1以后的版本修复了这个bug,只需要在设置LinearLayoutManager的时候,增加下面的代码:

    LinearLayoutManager manager = new LinearLayoutManager(this);
    manager.setAutoMeasureEnabled(true)

WelliJhon
166 声望14 粉丝

坚持原创!!!