美文网首页Android开发
RecyclerView.Adapter的item点击不了的原因

RecyclerView.Adapter的item点击不了的原因

作者: 你的益达233 | 来源:发表于2021-12-27 10:37 被阅读0次

先看下我的点击事件设置在那,应该也和你们的一样。

@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的。

好好检查代码即可

有人就会说,需求是这样,没办法啊。
是真的没办法嘛?比如它前后没变化为啥要一直刷,是对你自己的代码不自信嘛?看到了没,关键点前后是否有变化。

相关文章

网友评论

    本文标题:RecyclerView.Adapter的item点击不了的原因

    本文链接:https://www.haomeiwen.com/subject/gqqyqrtx.html