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);
的行之前添加到此方法
我正在使用 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);