У меня есть 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;
}
}
}
Метод 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 для разных позиций.