RecyclerView遇到的问题

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

LinearLayoutManager manager = new LinearLayoutManager(this);
manager.setAutoMeasureEnabled(true)
相关文章
相关标签/搜索