Java 更改可在回收器视图的itemview中绘制的渐变颜色

Java 更改可在回收器视图的itemview中绘制的渐变颜色,java,android,android-recyclerview,Java,Android,Android Recyclerview,我正在构建一个应用程序,它应该是直观的使用。所以,我有一个渐变绘制在每个项目的回收视图,这是应该改变它的颜色每次点击一个较深的颜色阴影,它以前是。例如,在特定的可绘制渐变上单击4次,从白色到粉红色再到红色再到栗色。我是这方面的初学者,能做到吗 试着查阅文档,但没有任何帮助 这是我的界面代码,它包含了颜色数组 public interface ColorUtils { int[][] colorsArray=new int[][]{ new int[]{R.color.red1,

我正在构建一个应用程序,它应该是直观的使用。所以,我有一个渐变绘制在每个项目的回收视图,这是应该改变它的颜色每次点击一个较深的颜色阴影,它以前是。例如,在特定的可绘制渐变上单击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);



            }
        }
    });

}

您可以在适配器中保留一个Hashmap或一个包含颜色值的列表。或者在myViewHolder.image上设置如下值作为标记:

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

然后单击一次,增加clickcount,并执行notifyDataSetChanged。 在onBindViewHolder中,使用getTag()并根据获得的值设置正确的颜色

为什么它不适合你? 1.您不需要调用onClick notifyDataSetChanged。 2.如果调用notifyDataSetChanged,它将通过onBindViewHolder,并使其变为白色
gd.setColor(Color.white)

如果不使用基于标记的颜色,而使用
setColor(Colow.WHITE)

另一个选项是创建一个hashmap,包括位置和viewHolder:

var-lsthorders:HashMap=HashMap()

onBindViewHolder您需要:

  synchronized(lstHolders) {
      lstHolders.put(position, holder)
  }
在MyViewHolder中创建一个类似void changeColor()的方法
然后单击Listener,根据您的位置获取viewholder并调用changeColor()。这将更改颜色,而无需调用notidyDataSetChanged(aka将仅修改该视图,而不是所有视图)

好的,我解决了它。在我的recycler视图中有7个项目,每个项目都有一个单独的int常量,并将它们初始化为0。然后,创建一个方法,将单击次数增加1,并在单击中对其进行初始化。当触发绑定视图持有者方法中的单击次数时,它会根据适配器位置立即存储单击次数

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;
}
public int this已单击(CustomCowAdapter.CowViewHolder CowViewHolder){
int position=cowViewHolder.getAdapterPosition();
开关(位置){
案例0:
返回setColorToDrawable(位置,单击1++);
案例1:
返回setColorToDrawable(位置,单击2++);
案例2:
返回setColorToDrawable(位置,单击S3++);
案例3:
返回setColorToDrawable(位置,单击4++);
案例4:
返回设置ColorToDrawable(位置,单击5++);
案例5:
返回setColorToDrawable(位置,单击6++);
违约:
返回setColorToDrawable(位置,单击S7++);
}
}
公共int setColorToDrawable(int i,int单击){
如果(单击次数<4次)返回颜色数组[i][clicks];
否则返回-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);

            }
cowViewHolder.itemView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
int color=colorUtils.thiswisclicked(cowViewHolder);
如果(颜色>0){
gd.setColor(ContextCompat.getColor(context,color));
}
如果(颜色<0){
gd.setColor(Color.WHITE);
感叹号.setVisibility(View.GONE);
smily.setVisibility(View.VISIBLE);
}

hi我试过这样做:gd.setColor((Integer)myViewHolder.image.getTag());getTag方法返回一个对象,我必须将该对象强制转换为整数,setColor方法才能工作,但它返回int[]所以android studio正在播放ClassCastException.idk,如果我没有弄错,但现在我正在将我的数组转换为二维列表,如果我能设法使它工作,我会给你回复的。谢谢你的建议!!