我正在使用this类在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次:可绘制的图像根据需要进行了更改,但是颜色
   保持不变。
 -第三次可绘制的图像和颜色均发生变化

我正在使用以下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并在onBindViewHoldr方法中进行检查就可以了,FeedModel将得到更新。所以我认为问题出在上面链接中提到的课程中

我希望实现的是:
 如果feedModel.isSubscribescribe,则将颜色更改为红色,并将可绘制的颜色更改为选中标志图标。否则,请保持初始值与布局xml中的相同。

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

最佳答案

我认为您是对的,但此方法存在错误。

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


在构造函数和onDraw方法中分配绘画颜色。

尝试在invalidate()paint.setColor(backgroundColor);行之前添加到此方法

10-08 14:36