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); } }