customView 中带有 onClick 事件的奇怪行为

Strange behaviour in customView with onClick event

我正在使用 this class 在 ImageView 上绘制 TriangleShapeView,它会在用户单击事件时更改其颜色和可绘制图像。

在 RecyclerView onBindViewHolder 方法中,我检查 feedModel.isSubscribed() 然后相应地设置 TriangleShapeView 颜色和可绘制图像:

public void onBindViewHolder(FeedViewHolder holder, final int position) {
        final FeedModel feedModel =this.feedCollection.get(position);
        if (feedModel.isSubscribed()) {
            holder.mTrView.setBackgroundColor(Color.RED);
            holder.mTrView.setDrawable(holder.mTrView.getContext().getResources().getDrawable(R.drawable.ic_check));
        } else {
            holder.mTrView.setBackgroundColor(Color.BLACK);
            holder.mTrView.setDrawable(holder.mTrView.getContext().getResources().getDrawable(R.drawable.ic_plus));
        }

在 setOnClickListener 中:

holder.itemView.setOnClickListener(v -> {
            if (FeedAdapter.this.onItemClieckListener != null){
                FeedAdapter.this.onItemClieckListener.onFeedItemClicked(feedModel);
                if (feedModel.isSubscribed()) {
                    feedModel.setIsSubscribed(false);
                     notifyItemChanged(position);
                } else {
                    feedModel.setIsSubscribed(true);
                    notifyItemChanged(position);
                }

            }
        }); 

这在第一次加载项目时工作正常,但在用户单击时:

- 第 1 次和第 2 次:可绘制图像根据需要进行了更改,但颜色 保持不变。
- 第 3 次可绘制图像和颜色都发生变化

我正在使用以下 xml 布局来扩充此自定义视图:

<cardView
  <RelativeLayout
  ....
 <com.xxx.TriangleShapeView
            android:id="@+id/trView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:elevation="15dp"
          TriangleShapeView:imgPadding="5dp"  
          TriangleShapeView:triangleBackground="@color/cardview_dark_background"
            TriangleShapeView:img="@drawable/ic_plus"/>

我相信,调用 OnClick 后 FeedModel 会更新,并且在 onBindViewHoldr 方法中检查正常。所以我觉得问题出在上面提到的class link

我想要实现的是: 如果 feedModel.isSubscribed 然后将颜色更改为红色并可绘制为复选图标。否则,保持布局中的初始值 xml.

也对 onClick 做出反应并更改颜色和图像

我认为你是对的,这个方法的错误。

 public void setBackgroundColor(int backgroundColor) {
    this.backgroundColor = backgroundColor;
    invalidate();
}

油漆颜色在构造函数和 onDraw 方法中分配。

尝试在 invalidate() 带有 paint.setColor(backgroundColor);

的行之前添加到此方法