Как использовать onBindViewHolder с onClick на RecyclerView?

У меня есть RecyclerView со списком строк и изображений. но мне нужно, когда изображение нажато, они меняют изображение и меняют цвет TextView, как это видео (записанное мной) Так должно было быть. но когда я нажимаю кнопку «Продолжить», они ничего не выбирают, этот SetOnclickListener находится внутри onBindViewHolder (я думаю, это проблема?)...

Но в моем RecyclerView у них уже есть метод Onclick, которым я могу «манипулировать» Как этот пример, но я не знаю, как реализовать использование .equals или .valueAt для каждой позиции в списке (54 элемента). я просто хочу знать, как использовать onBindViewHolder с onClick вместе

МОЙ RecyclerView.java Я протестировал так много всего в этом коде, так что... не волнуйтесь, извините за это, и я удалил большинство позиций, потому что я преодолел лимит, лол.

Эти комментарии к первым позициям связаны с тем, что когда я раскомментирую этот код, они меняют изображение и цвет текста, но не выбирают другое действие, см. первое видео!

public class RecyclerViewAdapter2 extends RecyclerView.Adapter<RecyclerViewAdapter2.ViewHolder> {

ArrayList<Categorias> TagsDaMarca;//change like this
ArrayList<Categorias> SubServicoTagsDaMarca;//change like this
ArrayList<Categorias> DICategorias;//change like this
ArrayList<String> DISubCategorias;

boolean test = false;
HashMap<Integer, List<String>> ListaCatSubCat = new HashMap<Integer, List<String>>();
public static SparseBooleanArray sparseBooleanArray;
// for identifying: in list which items are selected
OnRecyclerViewItemClickListener listener;
int meutotal = 0;


public RecyclerViewAdapter2(ArrayList<Categorias> TagsDaMarca1, OnRecyclerViewItemClickListener listener) {
    TagsDaMarca = TagsDaMarca1;
    SubServicoTagsDaMarca = TagsDaMarca1;
    DICategorias = TagsDaMarca1;

    sparseBooleanArray = new SparseBooleanArray();
    this.listener = listener;
}


@Override
public RecyclerViewAdapter2.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_marca_tag_servico_layout, parent, false);
    return new RecyclerViewAdapter2.ViewHolder(view);
}

@Override
public void onBindViewHolder(final RecyclerViewAdapter2.ViewHolder holder, int position) {

    Categorias item = DICategorias.get(position); //change like this

    if (position <= 0) {
//            holder.itemTextView.setOnClickListener(new View.OnClickListener() {
//                @Override
//                public void onClick(View v) {
//                    test = !test; //Switch boolean value
//                    holder.itemTextView.setFocusable(test);
//                    if (test == true) {
//                        holder.itemTextView.setTextColor(Color.rgb(236, 0, 140));
//                        holder.DICategoriasIcones.setImageResource(R.drawable.sub_categorias_acessorios);
//                    } else {
//                        holder.DICategoriasIcones.setImageResource(R.drawable.categorias_acessorios);
//                        holder.itemTextView.setTextColor(Color.rgb(190, 190, 190));
//                    }
//                }
//            });
        holder.itemTextView.setText(item.getCategoria());
        holder.DICategoriasIcones.setImageResource(item.getImagem());
    } else if (position <= 1) {
        holder.DICategoriasIcones.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                test = !test; //Switch boolean value
                holder.itemTextView.setFocusable(test);
                if (test == true) {
                    holder.itemTextView.setTextColor(Color.rgb(236, 0, 140));
                    holder.DICategoriasIcones.setImageResource(R.drawable.sub_categorias_animais);
                } else {
                    holder.DICategoriasIcones.setImageResource(R.drawable.categorias_animais);
                    holder.itemTextView.setTextColor(Color.rgb(190, 190, 190));
                }

                if (sparseBooleanArray.equals(1)) {
                    if (meutotal < 4) {
                        test = !test; //Switch boolean value
                        holder.itemTextView.setFocusable(test);
                        if (test == true) {
                            holder.itemTextView.setTextColor(Color.rgb(236, 0, 140));
                            holder.DICategoriasIcones.setImageResource(R.drawable.sub_categorias_animais);
                        } else {
                            holder.DICategoriasIcones.setImageResource(R.drawable.categorias_animais);
                            holder.itemTextView.setTextColor(Color.rgb(190, 190, 190));
                        }

                        sparseBooleanArray.put(getItemCount(), true);
                        notifyItemChanged(getItemCount());
                        meutotal = meutotal + 1;
                    } else {
                        sparseBooleanArray.put(getItemCount(), false);
                        notifyItemChanged(getItemCount());
                        meutotal = meutotal - 1;
                    }

                    if (!sparseBooleanArray.get(getItemCount())) {
                        if (meutotal < 4) {
                            holder.itemTextView.setTextColor(Color.rgb(236, 0, 140));
                            sparseBooleanArray.put(getItemCount(), true);
                            holder.DICategoriasIcones.setImageResource(R.drawable.sub_categorias_animais);
                            notifyItemChanged(getItemCount());
                            meutotal = meutotal + 1;
                        }
                    } else // if clicked item is already selected
                    {
                        sparseBooleanArray.put(getItemCount(), false);
                        notifyItemChanged(getItemCount());
                        meutotal = meutotal - 1;
                    }
                }
            }
        });
        holder.itemTextView.setText(item.getCategoria());
        holder.DICategoriasIcones.setImageResource(item.getImagem());
    } else if (position <= 2) {
        holder.DICategoriasIcones.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                test = !test; //Switch boolean value
                holder.itemTextView.setFocusable(test);
                if (test == true) {
                    holder.itemTextView.setTextColor(Color.rgb(236, 0, 140));
                    holder.DICategoriasIcones.setImageResource(R.drawable.sub_categorias_arquitetura);
                } else {
                    holder.DICategoriasIcones.setImageResource(R.drawable.categorias_arquitetura);
                    holder.itemTextView.setTextColor(Color.rgb(190, 190, 190));
                }

                if (sparseBooleanArray.equals(2)) {
                    if (meutotal < 4) {
                        test = !test; //Switch boolean value
                        holder.itemTextView.setFocusable(test);
                        if (test == true) {
                            holder.itemTextView.setTextColor(Color.rgb(236, 0, 140));
                            holder.DICategoriasIcones.setImageResource(R.drawable.sub_categorias_arquitetura);
                        } else {
                            holder.DICategoriasIcones.setImageResource(R.drawable.categorias_arquitetura);
                            holder.itemTextView.setTextColor(Color.rgb(190, 190, 190));
                        }

                        sparseBooleanArray.put(getItemCount(), true);
                        notifyItemChanged(getItemCount());
                        meutotal = meutotal + 1;
                    } else {
                        sparseBooleanArray.put(getItemCount(), false);
                        notifyItemChanged(getItemCount());
                        meutotal = meutotal - 1;
                    }

                    if (!sparseBooleanArray.get(getItemCount())) {
                        if (meutotal < 4) {
                            holder.itemTextView.setTextColor(Color.rgb(236, 0, 140));
                            sparseBooleanArray.put(getItemCount(), true);
                            holder.DICategoriasIcones.setImageResource(R.drawable.sub_categorias_arquitetura);
                            notifyItemChanged(getItemCount());
                            meutotal = meutotal + 1;
                        }
                    } else // if clicked item is already selected
                    {
                        sparseBooleanArray.put(getItemCount(), false);
                        notifyItemChanged(getItemCount());
                        meutotal = meutotal - 1;
                    }
                }
            }
        });
        holder.itemTextView.setText(item.getCategoria());
        holder.DICategoriasIcones.setImageResource(item.getImagem());
    } else if (position <= 3) {
        holder.DICategoriasIcones.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                test = !test; //Switch boolean value
                holder.itemTextView.setFocusable(test);
                if (test == true) {
                    holder.itemTextView.setTextColor(Color.rgb(236, 0, 140));
                    holder.DICategoriasIcones.setImageResource(R.drawable.sub_categorias_astrologia);
                } else {
                    holder.DICategoriasIcones.setImageResource(R.drawable.categorias_astrologia);
                    holder.itemTextView.setTextColor(Color.rgb(190, 190, 190));
                }

                if (sparseBooleanArray.valueAt(0)) {
                    if (meutotal < 4) {
                        test = !test; //Switch boolean value
                        holder.itemTextView.setFocusable(test);
                        if (test == true) {
                            holder.itemTextView.setTextColor(Color.rgb(236, 0, 140));
                            holder.DICategoriasIcones.setImageResource(R.drawable.sub_categorias_astrologia);
                        } else {
                            holder.DICategoriasIcones.setImageResource(R.drawable.categorias_astrologia);
                            holder.itemTextView.setTextColor(Color.rgb(190, 190, 190));
                        }

                        sparseBooleanArray.put(getItemCount(), true);
                        notifyItemChanged(getItemCount());
                        meutotal = meutotal + 1;
                    } else {
                        sparseBooleanArray.put(getItemCount(), false);
                        notifyItemChanged(getItemCount());
                        meutotal = meutotal - 1;
                    }

                    if (!sparseBooleanArray.get(getItemCount())) {
                        if (meutotal < 4) {
                            holder.itemTextView.setTextColor(Color.rgb(236, 0, 140));
                            sparseBooleanArray.put(getItemCount(), true);
                            holder.DICategoriasIcones.setImageResource(R.drawable.sub_categorias_astrologia);
                            notifyItemChanged(getItemCount());
                            meutotal = meutotal + 1;
                        }
                    } else // if clicked item is already selected
                    {
                        sparseBooleanArray.put(getItemCount(), false);
                        notifyItemChanged(getItemCount());
                        meutotal = meutotal - 1;
                    }
                }
            }
        });
        holder.itemTextView.setText(item.getCategoria());
        holder.DICategoriasIcones.setImageResource(item.getImagem());
    } else if (position <= 4) {
        test = !test; //Switch boolean value
        holder.itemTextView.setFocusable(test);

        if (sparseBooleanArray.equals(4)) {
            if (meutotal < 4) {
                test = !test; //Switch boolean value
                holder.itemTextView.setFocusable(test);
                if (test == true) {
                    holder.itemTextView.setTextColor(Color.rgb(236, 0, 140));
                    holder.DICategoriasIcones.setImageResource(R.drawable.sub_categorias_atualidades);
                } else {
                    holder.DICategoriasIcones.setImageResource(R.drawable.categorias_atualidades);
                    holder.itemTextView.setTextColor(Color.rgb(190, 190, 190));
                }

                sparseBooleanArray.put(getItemCount(), true);
                notifyItemChanged(getItemCount());
                meutotal = meutotal + 1;
            } else {
                sparseBooleanArray.put(getItemCount(), false);
                notifyItemChanged(getItemCount());
                meutotal = meutotal - 1;
            }

            if (!sparseBooleanArray.get(getItemCount())) {
                if (meutotal < 4) {
                    holder.itemTextView.setTextColor(Color.rgb(236, 0, 140));
                    sparseBooleanArray.put(getItemCount(), true);
                    holder.DICategoriasIcones.setImageResource(R.drawable.sub_categorias_atualidades);
                    notifyItemChanged(getItemCount());
                    meutotal = meutotal + 1;
                }
            } else // if clicked item is already selected
            {
                sparseBooleanArray.put(getItemCount(), false);
                notifyItemChanged(getItemCount());
                meutotal = meutotal - 1;
            }
        }
        holder.itemTextView.setText(item.getCategoria());
        holder.DICategoriasIcones.setImageResource(item.getImagem());
    } else if (position <= 5) {
        test = !test; //Switch boolean value
        holder.itemTextView.setFocusable(test);

        if (sparseBooleanArray.equals(5)) {
            if (meutotal < 4) {
                test = !test; //Switch boolean value
                holder.itemTextView.setFocusable(test);
                if (test == true) {
                    holder.itemTextView.setTextColor(Color.rgb(236, 0, 140));
                    holder.DICategoriasIcones.setImageResource(R.drawable.sub_categorias_autoconhecimento);
                } else {
                    holder.DICategoriasIcones.setImageResource(R.drawable.categorias_autoconhecimento);
                    holder.itemTextView.setTextColor(Color.rgb(190, 190, 190));
                }

                sparseBooleanArray.put(getItemCount(), true);
                notifyItemChanged(getItemCount());
                meutotal = meutotal + 1;
            } else {
                sparseBooleanArray.put(getItemCount(), false);
                notifyItemChanged(getItemCount());
                meutotal = meutotal - 1;
            }

            if (!sparseBooleanArray.get(getItemCount())) {
                if (meutotal < 4) {
                    holder.itemTextView.setTextColor(Color.rgb(236, 0, 140));
                    sparseBooleanArray.put(getItemCount(), true);
                    holder.DICategoriasIcones.setImageResource(R.drawable.sub_categorias_autoconhecimento);
                    notifyItemChanged(getItemCount());
                    meutotal = meutotal + 1;
                }
            } else // if clicked item is already selected
            {
                sparseBooleanArray.put(getItemCount(), false);
                notifyItemChanged(getItemCount());
                meutotal = meutotal - 1;
            }
        }
        holder.itemTextView.setText(item.getCategoria());
        holder.DICategoriasIcones.setImageResource(item.getImagem());
    } else if (position <= 6) {
        holder.itemTextView.setText(item.getCategoria());
        holder.itemTextView.setBackgroundColor(Color.TRANSPARENT);
        holder.DICategoriasIcones.setImageResource(item.getImagem());
        holder.itemTextView.setTextColor(Color.rgb(190, 190, 190));
        holder.DICategoriasIcones.setEnabled(true);
        holder.itemTextView.setEnabled(true);
    } else if (position <= 7) {
        holder.itemTextView.setText(item.getCategoria());
        holder.itemTextView.setBackgroundColor(Color.TRANSPARENT);
        holder.DICategoriasIcones.setImageResource(item.getImagem());
        holder.itemTextView.setTextColor(Color.rgb(190, 190, 190));
        holder.DICategoriasIcones.setEnabled(true);
        holder.itemTextView.setEnabled(true);
    } else {
        holder.itemTextView.setText(item.getCategoria());
        if (sparseBooleanArray.get(position)) {
            holder.itemTextView.setBackgroundColor(Color.TRANSPARENT);
            holder.itemTextView.setTextColor(Color.rgb(190, 190, 190));
        } else {
            holder.itemTextView.setBackgroundColor(Color.TRANSPARENT);
            holder.itemTextView.setTextColor(Color.rgb(190, 190, 190));
        }
    }

}

@Override
public int getItemCount() {
    if (TagsDaMarca != null) {
        return TagsDaMarca.size();
    } else if (SubServicoTagsDaMarca != null) {
        return SubServicoTagsDaMarca.size();
    } else if (DICategorias != null) {
        return DICategorias.size();
    }
    return 0;
}


/******** View Holder Class*/
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    TextView itemTextView;
    ImageView DICategoriasIcones;
    public TextView alert;

    public ViewHolder(View itemView) {
        super(itemView);
        itemTextView = itemView.findViewById(R.id.itemTextView);
        itemTextView.setOnClickListener(this);

        DICategoriasIcones = itemView.findViewById(R.id.DICategoriasIcones);
        DICategoriasIcones.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {

        if (!sparseBooleanArray.get(getAdapterPosition())) {
            if (meutotal < 4) {
                sparseBooleanArray.put(getAdapterPosition(), true);
                notifyItemChanged(getAdapterPosition());
                meutotal = meutotal + 1;
            }
        } else // if clicked item is already selected
        {
            sparseBooleanArray.put(getAdapterPosition(), false);
            notifyItemChanged(getAdapterPosition());
            meutotal = meutotal - 1;
        }
    }
}

public interface OnRecyclerViewItemClickListener {
    public void selectedItemCount(int count);
}
}

У меня уже есть это onClick в моем RecyclerView, но как я могу использовать его с onBindViewHolder?

@Override
public void onClick(View view) {
        //meutotal is for loop to limit to select only 4 categories
    if (!sparseBooleanArray.get(getAdapterPosition())) {
        if (meutotal < 4) {
            sparseBooleanArray.put(getAdapterPosition(), true);
            notifyItemChanged(getAdapterPosition());
            meutotal = meutotal + 1;
        }
    } else // if clicked item is already selected
    {
        sparseBooleanArray.put(getAdapterPosition(), false);
        notifyItemChanged(getAdapterPosition());
        meutotal = meutotal - 1;
    }
}
}
0
0
126
1

Ответы 1

Метод onBindViewHolder() вызывается несколько раз и может быть обновлен с помощью переменной
. создайте переменную selectedItemPosition = -1; теперь просто установите переменную в вашем методе onClick() следующим образом,

@Override
public void onClick(View view) {
        if (selectedItemPosition != getAdapterPosition()) {
          selectedItemPosition = getAdapterPosition();
          notifyDataSetChanged();
         } else {
           //handle what happens if the user clicks the same item again
         }

        //meutotal is for loop to limit to select only 4 categories
    if (!sparseBooleanArray.get(getAdapterPosition())) {
        if (meutotal < 4) {
            sparseBooleanArray.put(getAdapterPosition(), true);
            notifyItemChanged(getAdapterPosition());
            meutotal = meutotal + 1;
        }
    } else // if clicked item is already selected
    {
        sparseBooleanArray.put(getAdapterPosition(), false);
        notifyItemChanged(getAdapterPosition());
        meutotal = meutotal - 1;
    }
}
}

в соответствии с вашими потребностями было бы лучше использовать цветной фильтр, чем заменять изображение, так как это экономит место для вашего приложения, В свой метод onBindViewHolder() добавьте этот код:

if (selectedItemPosition != -1 && selectedItemPosition  == position) {
   viewHolder.imageView.setColorFilter(ContextCompat.getColor(mContext, R.color.yourcolor));
}

Спасибо за ответ!. Я сделал все, что ты мне сказал, но... мои категории - это чушь. ржу не могу! они уже выбирают 11 категорий, и если я нажму на какую-то категорию, они выберут 11 для разных позиций.

PinhaDooido 04.02.2019 19:58

Другие вопросы по теме