先看下我的点击事件设置在那,应该也和你们的一样。
@Override
public void onBindViewHolder(LeftViewHolder holder, int position) {
LeftBean target = getItem(position);
holder.tvTitle.setText(target.getTitle());
if (target.isSelect()){
holder.itemView.setBackgroundColor(ContextCompat.getColor(holder.itemView.getContext(), R.color.white));
} else {
holder.itemView.setBackgroundColor(ContextCompat.getColor(holder.itemView.getContext(), R.color.c_aaa));
}
//绑定监听事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.v("onClick",position+"\t");
}
});
}
点击后这个log就是没打印。换成其他控件也是一样,奇了怪了。这么检查,好像我的代码也是没问题啊。
真相只有一个:有地方一直在调该adapter的notifyDataSetChanged();
比如我犯的错就是在另一个recyclerView的item判断不好,一直刷了这个adapter的notifyDataSetChanged()
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDrawOver(c, parent, state);
final int position = ((LinearLayoutManager) parent.getLayoutManager()).findFirstVisibleItemPosition();
if (position == RecyclerView.NO_POSITION) {
return;
}
View child = parent.findViewHolderForAdapterPosition(position).itemView;
String initial = getTag(position);
if (initial == null) {
return;
}
boolean flag = false;
if (getTag(position + 1) != null && !initial.equals(getTag(position + 1))) {
if (child.getHeight() + child.getTop() < mTitleHeight) {
c.save();
flag = true;
c.translate(0, child.getHeight() + child.getTop() - mTitleHeight);
}
}
c.drawRect(parent.getPaddingLeft(), parent.getPaddingTop(),
parent.getRight() - parent.getPaddingRight(), parent.getPaddingTop() + mTitleHeight, mBackgroundPaint);
c.drawText(initial, child.getPaddingLeft() + mTextStartMargin,
parent.getPaddingTop() + mTitleHeight - (mTitleHeight - mTextHeight) / 2 - mTextBaselineOffset, mTextPaint);
if (flag) {
c.restore();
}
if (mList.containsValue(initial) && onChangeTitleListener != null){
Set<Map.Entry<Integer, String>> set = mList.entrySet();
// 遍历键值对对象的集合,得到每一个键值对对象
for (Map.Entry<Integer, String> me : set) {
// 根据键值对对象获取键和值
Integer key = me.getKey();
String value = me.getValue();
if (value.equals(initial)){
onChangeTitleListener.onChangePosition(key);
break;
}
}
}
}
onChangeTitleListener.onChangePosition(key)这个就是回调刷新adapter的。
好好检查代码即可
有人就会说,需求是这样,没办法啊。
是真的没办法嘛?比如它前后没变化为啥要一直刷,是对你自己的代码不自信嘛?看到了没,关键点前后是否有变化。
网友评论