RecyclerView遇到的问题
1.RecyclerView中的Item中使用CheckBox出现的问题:
我们在滑动的时候,其他行的checkbox会莫名地调用setOnCheckedChangeListener,这样我们在滑动的时候,会发现其他行的checkbox会很奇怪勾上,然后滑出界面,又消失了,这个时候,我们需要在
RecyclerView.Adapter的onBindViewHolder方法中,holder.cb.setOnCheckedChangeListener(null);将checkbox的监听取消掉,这样就能保证只有是手动切换状态才能发生setOnCheckedChangeListener内部的方法。
具体实现可以看:
(InvoiceOrderViewHolder holderposition) {
InvoiceOrderBean bean = .get(position)
holder..setText(String.format(.getString(R.string.)bean.getCreateTime()))
holder..setText(String.format(bean.getTotalNum()StringUtil.getDoublePriceNoYuan(bean.getSaleCost())))
holder..setOnCheckedChangeListener()holder..setChecked(bean.isSelect())holder..setOnClickListener(View.OnClickListener() {
(View v) {
Intent intent = Intent(PurchaseOrderDetailActivity.)intent.putExtra(PurchaseOrderDetailActivity.String.valueOf(.getOrderId())).startActivity(intent)}
})holder..setOnCheckedChangeListener(CompoundButton.OnCheckedChangeListener() {
(CompoundButton buttonViewisChecked) {
.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是对应的,不然会出现数据紊乱的情况。
(ViewHolder holderposition) {
Context context = holder..getContext()AccountManageBean bean = .get(position)holder..setText(bean.getJobName())holder..setTag(bean.getJobCode())holder..setText(bean.getName())holder..setText(bean.getPhone())holder..addTextChangedListener(SimpleTextWatcher() {
(Editable s) {
(!= ) {
AccountManageBean temp = .get(.getAdapterPosition())
(!TextUtils.equals(temp.getName()s.toString())) {
.isChange()temp.setChange()temp.setName(s.toString())
}
}
}
})}
3.在你用了上面的方案,都感觉达不到你的要求,可以屡试不爽的方案,就是,我们在adapter中外部定义一个private SparseBooleanArrayselectedItems; 来进行记录,我们当前点击的是哪一行,这样我们下次滑动的时候,就根据这个来判断,为true的就是你想影响的那一行,其他行的默认false,就不执行就可以了,都不要执行listener的代码就可以了。
ServiceAdapter BGARecyclerViewAdapter<ServerCategoryBean> {
String = SparseBooleanArray = -OnItemClickListener ServiceAdapter(RecyclerView recyclerViewitemLayoutId) {
(recyclerViewitemLayoutId)= SparseBooleanArray()}
(BGAViewHolderHelper viewHolderHelperpositionServerCategoryBean model) {
TextView tv = viewHolderHelper.getView(R.id.)LinearLayout ll = viewHolderHelper.getView(R.id.)tv.setText(model.getCategoryName())(.get(position)) {
highLight(tvll.getResources().getColor(R.color.).getResources().getColor(R.color.))} {
(== ServicePickActivity.) {
highLight(tvll.getResources().getColor(R.color.).getResources().getColor(R.color.))} (== ServicePickActivity.) {
highLight(tvll.getResources().getColor(R.color.).getResources().getColor(R.color.))}
}
(position == && ) {
switchColor(positiontvllmodel)= }
ll.setOnClickListener(View.OnClickListener() {
(View v) {
switchColor()}
})}
(positionTextView tvLinearLayout llServerCategoryBean model) {
.put(position)highLight(tvll.getResources().getColor(R.color.).getResources().getColor(R.color.))(!= position && != -) {
.delete()notifyItemChanged()}
= position(!= ) {
.onItemClick(model)}
}