我正在构建一个应用程序,该应用程序在视觉上应该直观易用。因此,我在回收站视图的每个项目中都有一个可绘制的渐变,该渐变应该在每次单击时将其颜色更改为以前的深色。例如。在特定的渐变绘制上单击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);
}
}
});
}
答案 0 :(得分:0)
您在适配器中保留一个哈希表或包含颜色值的列表。或者,您在myViewHolder.image上设置标签,如:
myViewHolder.image.setTag(ColorUtils.colorsArray[myViewHolder.getAdapterPosition()])
然后onClick可以增加点击计数,并执行notifyDataSetChanged。 在onBindViewHolder中,您可以获取getTag()并根据获取的值来设置正确的颜色。
为什么它对您不起作用?
1.您不调用onClick notifyDataSetChanged。
2.如果您要调用notifyDataSetChanged,它将通过onBindViewHolder,并使其变为白色gd.setColor(Color.WHITE);
如果您代替setColor(Colow.WHITE)
使用基于TAG的颜色,它将起作用。
另一种选择是创建一个位置和viewHolder的哈希图:
var lstHolders: HashMap<Int, MyViewHolder> = HashMap()
您要做的onBindViewHolder:
synchronized(lstHolders) {
lstHolders.put(position, holder)
}
然后在MyViewHolder中创建一个像void changeColor()这样的方法 然后onClickListener,您将根据自己的位置获取视域并调用changeColor()。这将更改颜色,而无需调用notidyDataSetChanged(aka只会修改该颜色,而不会修改所有视图)
答案 1 :(得分:0)
好的,我解决了。我在回收器视图中有7个项目,分别为每个int常数,将它们初始化为0。然后,创建了一种将点击计数增加1并在bind viewholder方法中的click方法中初始化的方法,它现在根据适配器位置存储点击计数。
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);
}