RecyclerView遇到的问题

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

    我们在滑动的时候,其他行的checkbox会莫名地调用setOnCheckedChangeListener,这样我们在滑动的时候,会发现其他行的checkbox会很奇怪勾上,然后滑出界面,又消失了,这个时候,我们需要在

RecyclerView.Adapter的onBindViewHolder方法中,holder.cb.setOnCheckedChangeListener(null);将checkbox的监听取消掉,这样就能保证只有是手动切换状态才能发生setOnCheckedChangeListener内部的方法。

具体实现可以看:

@Override
public void onBindViewHolder(InvoiceOrderViewHolder holder, final int position) {
  final InvoiceOrderBean bean = datas.get(position);
 holder.orderTimeTv.setText(String.format(mContext.getString(R.string.order_create_time), bean.getCreateTime()));
 holder.orderInfo.setText(String.format("共%s件 实付:¥%s",
 bean.getTotalNum(), StringUtil.getDoublePriceNoYuan(bean.getSaleCost())));
 holder.cb.setOnCheckedChangeListener(null);
 holder.cb.setChecked(bean.isSelect());
 holder.detailLl.setOnClickListener(new View.OnClickListener() {
        @Override
 public void onClick(View v) {
  Intent intent = new Intent(mContext, PurchaseOrderDetailActivity.class);
 intent.putExtra(PurchaseOrderDetailActivity.ORDER_ID, String.valueOf(bean.getOrderId()));
 mContext.startActivity(intent);
 }
    });

 holder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            bean.setSelect(isChecked);
       }
    });
}

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

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

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
  final Context context = holder.itemView.getContext();
  final AccountManageBean bean = datas.get(position);
 holder.jobEt.setText(bean.getJobName());
 holder.jobEt.setTag(bean.getJobCode());
 holder.nameEt.setText(bean.getName());
 holder.phoneEt.setText(bean.getPhone())
 holder.nameEt.addTextChangedListener(new SimpleTextWatcher() {
        @Override
       public void afterTextChanged(Editable s) {
            if (null != mListener) {
                AccountManageBean temp = datas.get(holder.getAdapterPosition());
                if (!TextUtils.equals(temp.getName(), s.toString())) {
                    mListener.isChange(true);
                   temp.setChange(true);
                   temp.setName(s.toString());
              }
            }
        }
    });

}

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

 public ServiceAdapter(RecyclerView recyclerView, int itemLayoutId) {

    super(recyclerView, itemLayoutId);
 selectedItems = new SparseBooleanArray();
}

@Override
protected void fillData(BGAViewHolderHelper viewHolderHelper, final int position, final ServerCategoryBean model) {
    final TextView tv = viewHolderHelper.getView(R.id.service_item_tv);
 final LinearLayout ll = viewHolderHelper.getView(R.id.service_item_ll);
 tv.setText(model.getCategoryName());

 if (selectedItems.get(position, false)) {
        highLight(tv, ll, mContext.getResources().getColor(R.color.red), mContext.getResources().getColor(R.color.white));
 } else {
        if (req_view_code == ServicePickActivity.SERVICE_RV_CODE) {
            highLight(tv, ll, mContext.getResources().getColor(R.color.text_666666), mContext.getResources().getColor(R.color.rv_bg));
 } else if (req_view_code == ServicePickActivity.SUB_SERVICE_RV_CODE) {
            highLight(tv, ll, mContext.getResources().getColor(R.color.text_666666), mContext.getResources().getColor(R.color.white));
 }
    }
    if (position == 0 && openDefalut) {
        switchColor(position, tv, ll, model);
       openDefalut = false;
 }

    ll.setOnClickListener(new View.OnClickListener() {
        @Override
           public void onClick(View v) {
            switchColor(position, tv, ll, model);
 }
    });
}

private void switchColor(int position, TextView tv, LinearLayout ll, ServerCategoryBean model) {
    selectedItems.put(position, true);
   highLight(tv, ll, mContext.getResources().getColor(R.color.light_red), mContext.getResources().getColor(R.color.white));

    if (mLastPos != position && mLastPos != -1) {
         selectedItems.delete(mLastPos);
        notifyItemChanged(mLastPos);
   }
    mLastPos = position;

    if (null != listener) {
        listener.onItemClick(model, req_view_code);
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值