在回收器视图的项视图中更改渐变可绘制对象的颜色



我正在构建一个应该在视觉上直观使用的应用程序。因此,我在回收器视图的每个项目中都有一个渐变可绘制对象,该渐变对象应该在每次单击时将其颜色更改为以前较深的颜色阴影。例如,从白色到粉红色到红色到栗色,在特定渐变可绘制对象上单击4次。我是这方面的初学者,可以做到吗?

尝试浏览文档没有任何帮助。

这是我的接口代码,它保存了颜色数组数组。

public interface ColorUtils {
int[][] colorsArray=new int[][]{
new int[]{R.color.red1, R.color.red2, R.color.red3, R.color.red4 },
new int[]{R.color.blue1, R.color.blue2, R.color.blue3, R.color.blue4},
new int[]{R.color.green1, R.color.green2, R.color.green3, R.color.green4},
new int[]{R.color.yellow1, R.color.yellow2, R.color.yellow3, R.color.yellow4},
new int[]{R.color.orange1, R.color.orange2, R.color.orange3, R.color.orange4},
new int[]{R.color.brown1, R.color.brown2, R.color.brown3, R.color.brown4},
new int[]{R.color.grey1, R.color.grey2, R.color.grey3, R.color.grey4}
};
}

这是我在 onBindViewHolder 方法上尝试做的事情。

int countOfClicks=0;
@Override
public void onBindViewHolder(@NonNull final MyViewHolder myViewHolder, int i) {

final GradientDrawable gd = (GradientDrawable) myViewHolder.image.getDrawable().getCurrent();
final ImageView exclamation = myViewHolder.exclamation;
final ImageView smily = myViewHolder.smily;
gd.setColor(Color.WHITE);
myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
countOfClicks++;
switch (countOfClicks) {
case 1:
gd.setColor(ColorUtils.colorsArray[myViewHolder.getAdapterPosition()][countOfClicks]);
break;
case 2:
gd.setColor(ColorUtils.colorsArray[myViewHolder.getAdapterPosition()][countOfClicks]);
break;
case 3:
gd.setColor(ColorUtils.colorsArray[myViewHolder.getAdapterPosition()][countOfClicks]);

break;
default:
gd.setColor(ColorUtils.colorsArray[myViewHolder.getAdapterPosition()][countOfClicks]);
exclamation.setVisibility(View.GONE);
smily.setVisibility(View.VISIBLE);

}
}
});
}

您在适配器中保留了一个哈希图,或者一个带有颜色值的列表。或者,您将myViewHolder.image上的值设置为标签,例如:

myViewHolder.image.setTag(ColorUtils.colorsArray[myViewHolder.getAdapterPosition()])

然后在单击时,您增加点击计数,并通知数据集已更改。 在 onBindViewHolder 中,您可以获取 Tag(( 并根据您获得的值设置正确的颜色。

为什么它不适合你? 1. 您不调用单击通知数据集已更改。 2. 如果您调用 notifyDataSetChanged,它会通过 onBindViewHolder,这会导致它变成白色gd.setColor(Color.WHITE);

如果您这样做而不是根据 TAGsetColor(Colow.WHITE)颜色,它将起作用。

另一种选择是创建一个位置和视图持有人的哈希图:

var lstHolders: HashMap<Int, MyViewHolder> = HashMap()

在 BindViewHolder 上,您执行以下操作:

synchronized(lstHolders) {
lstHolders.put(position, holder)
}

在你的MyViewHolder中,你创建了一个类似void changeColor((的方法。 然后在ClickListener上,您可以根据自己的位置获取视图,并调用changeColor((。这将更改颜色,而无需调用 notidyDataSetChanged(也就是只会修改它而不是所有视图(

好的,我解决了。 我的回收器视图中有 7 个项目,为每个项目制作了一个单独的 int 常量,将它们初始化为 0。然后,制作一个将点击次数增加一的方法,并在点击方法内初始化它,在绑定查看者方法被触发,它现在根据适配器位置存储点击计数。

public int thisWasClicked(CustomCowAdapter.CowViewHolder cowViewHolder) {
int position = cowViewHolder.getAdapterPosition();
switch (position) {
case 0:
return setColorToDrawable(position, clicks1++);
case 1:
return setColorToDrawable(position, clicks2++);
case 2:
return setColorToDrawable(position, clicks3++);
case 3:
return setColorToDrawable(position, clicks4++);
case 4:
return setColorToDrawable(position, clicks5++);
case 5:
return setColorToDrawable(position, clicks6++);
default:
return setColorToDrawable(position, clicks7++);
}

}

public int setColorToDrawable(int i, int clicks) {
if (clicks < 4) return colorsArray[i][clicks];
else return -1;
}

然后在 onBindViewHolder 中

cowViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int color = colorUtils.thisWasClicked(cowViewHolder);
if (color > 0) {
gd.setColor(ContextCompat.getColor(context, color));
}
if (color < 0) {
gd.setColor(Color.WHITE);
exclamation.setVisibility(View.GONE);
smily.setVisibility(View.VISIBLE);
}

最新更新