Options 1 to 10 in a recyclerView

0

I am asking a rating question with options from 1 to 10 but I have a problem in the "setOnClickListener ()" event to set the background if it is selected or deselected by the position that the onBindViewHolder () method of the RecyclerAdapter gives. I hope you understand my question and can help me solve it, here is the code I use.

MainActivity:

package bitlicon.preguntacinco;

import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.LinearSnapHelper;
import android.support.v7.widget.RecyclerView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        final RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_items);

        final List<Item> itemList = new ArrayList<>();
        itemList.add(new Item(0, "0"));
        itemList.add(new Item(1, "1"));
        itemList.add(new Item(2, "2"));
        itemList.add(new Item(3, "3"));
        itemList.add(new Item(4, "4"));
        itemList.add(new Item(5, "5"));
        itemList.add(new Item(6, "6"));
        itemList.add(new Item(7, "7"));
        itemList.add(new Item(8, "8"));
        itemList.add(new Item(9, "9"));
        itemList.add(new Item(10, "10"));

        final LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.HORIZONTAL, false);
        recyclerView.setLayoutManager(layoutManager);
        new LinearSnapHelper().attachToRecyclerView(recyclerView);
        final ItemAdapter itemAdapter = new ItemAdapter(MainActivity.this, itemList, recyclerView);
        recyclerView.setAdapter(itemAdapter);

        recyclerView.smoothScrollToPosition(1);

        itemAdapter.setOnItemSizeListener(new ItemAdapter.OnItemSizeListener() {
            @Override
            public void onItemSize(int size) {
                itemAdapter.setOnItemSizeListener(null);
                int padding = (recyclerView.getMeasuredWidth() - size)  / 2;
                recyclerView.setPadding(padding, 0, padding, 0);
            }
        });

        itemAdapter.setOnItemClickListener(new ItemAdapter.OnItemClickListener() {
            @Override
            public void onClick(int position) {
                int itemID = -1;
                if (position != -1)
                    itemID = itemList.get(position).getItemID();
                Toast.makeText(MainActivity.this, String.valueOf(itemID), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

Item:

package bitlicon.preguntacinco;

public class Item {

    private int itemID;
    private String number;

    public Item(int itemID, String number) {
        this.itemID = itemID;
        this.number = number;
    }

    public int getItemID() {
        return itemID;
    }

    public String getNumber() {
        return number;
    }
}

ItemAdapter:

package bitlicon.preguntacinco;

import android.app.Activity;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.support.v4.content.ContextCompat;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.TextView;

import java.util.List;

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

    private int positionItem = -1;
    RecyclerView recyclerView;
    private Activity activity;
    private List<Item> items;

    private boolean hacerCambio = false;
    private int itemCambio = -1;

    private OnItemSizeListener onItemSizeListener;
    private OnItemClickListener onItemClickListener;

    public ItemAdapter(Activity activity, List<Item> items, RecyclerView recyclerView) {
        this.recyclerView = recyclerView;
        this.activity = activity;
        this.items = items;
}

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

    @Override
    public void onBindViewHolder(final ViewHolder viewHolder, int position) {
        viewHolder.textView.setId(items.get(viewHolder.getAdapterPosition()).getItemID());
        viewHolder.textView.setText(items.get(viewHolder.getAdapterPosition()).getNumber());

        if (hacerCambio && itemCambio == viewHolder.textView.getId()) {
            ViewHolder item = (ViewHolder) recyclerView.findViewHolderForAdapterPosition(itemCambio);
            if (item != null) {
                item.fondo.setScaleX(0);
                item.fondo.setScaleY(0);

                item.fondo.setBackground(ContextCompat.getDrawable(activity, R.drawable.background_unselect));
                item.textView.setTextColor(ColorStateList.valueOf(ContextCompat.getColor(activity, android.R.color.darker_gray)));

                item.fondo.animate().scaleX(1).scaleY(1).setInterpolator(AnimationUtils.loadInterpolator(activity, android.R.interpolator.bounce)).setDuration(600);

                hacerCambio = false;
                itemCambio = -1;
            }
        }

        viewHolder.textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (onItemClickListener != null)
                    onItemClickListener.onClick(viewHolder. getAdapterPosition(), viewHolder);

                if (positionItem == -1) {
                    positionItem = viewHolder.textView.getId();
                    ViewHolder opcion = (ViewHolder) recyclerView.findViewHolderForAdapterPosition(positionItem);
                    opcion.fondo.setScaleX(0);
                    opcion.fondo.setScaleY(0);

                    opcion.fondo.setBackground(ContextCompat.getDrawable( activity, R.drawable.background_select));
                    opcion.textView.setTextColor(ColorStateList.valueOf( ContextCompat.getColor(activity, android.R.color.white)));

                    opcion.fondo.animate().scaleX(1).scaleY(1).setInterpolator(AnimationUtils.loadInterpolator(activity,android.R.interpolator.bounce)).setDuration(600);
                } else if (positionItem == viewHolder.textView.getId()) {
                    ViewHolder opcion = (ViewHolder) recyclerView.findViewHolderForAdapterPosition(positionItem);
                    opcion.fondo.setScaleX(0);
                    opcion.fondo.setScaleY(0);

                    opcion.fondo.setBackground(ContextCompat.getDrawable(activity, R.drawable.background_unselect));
                    opcion.textView.setTextColor(ColorStateList.valueOf( ContextCompat.getColor(activity, android.R.color.darker_gray)));

                    opcion.fondo.animate().scaleX(1).scaleY(1).setInterpolator(AnimationUtils.loadInterpolator(activity,android.R.interpolator.bounce)).setDuration(600);
                    positionItem = -1;
                } else {
                    int itemActual = viewHolder.textView.getId();
                    ViewHolder opcion = (ViewHolder) recyclerView.findViewHolderForAdapterPosition(itemActual);
                    opcion.fondo.setScaleX(0);
                    opcion.fondo.setScaleY(0);

                    opcion.fondo.setBackground(ContextCompat.getDrawable( activity, R.drawable.background_select));
                    opcion.textView.setTextColor(ColorStateList.valueOf( ContextCompat.getColor(activity, android.R.color.white)));

                    opcion.fondo.animate().scaleX(1).scaleY(1).setInterpolator(AnimationUtils.loadInterpolator(activity,android.R.interpolator.bounce)).setDuration(600);

                    ViewHolder holder = (ViewHolder) recyclerView.findViewHolderForItemId(positionItem);

                    if (holder != null) {
                        holder.fondo.setScaleX(0);
                        holder.fondo.setScaleY(0);

                        holder.fondo.setBackground(ContextCompat.getDrawable(activity, R.drawable.background_unselect));
                        holder.textView.setTextColor(ColorStateList.valueOf(ContextCompat. getColor(activity, android.R.color.darker_gray)));

                        holder.fondo.animate().scaleX(1).scaleY(1).setInterpolator(AnimationUtils.loadInterpolator(activity, android.R.interpolator.bounce)).setDuration(600);
                    } else {
                        hacerCambio = true;
                        itemCambio = positionItem;
                    }

                    positionItem = viewHolder.textView.getId();
                }
            }
        });
    }

    @Override
    public int getItemCount() {
        return items.size();
    }

    public void setOnItemSizeListener(OnItemSizeListener onItemSizeListener) {
        this.onItemSizeListener = onItemSizeListener;
    }

    public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
        this.onItemClickListener = onItemClickListener;
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        private TextView textView;
        private View rootView;
        private View fondo;

        public ViewHolder(View view) {
            super(view);

            rootView = view;
            textView = (TextView) view.findViewById(R.id.opcion);
            fondo = (View) view.findViewById(R.id.fondo);
        }
    }

    public interface OnItemSizeListener {
        void onItemSize(int size);
    }

    public interface OnItemClickListener {
        void onClick(int position, ItemAdapter.ViewHolder viewHolder);
    }
}
    
asked by Carlos 04.07.2017 в 23:57
source

1 answer

0

so I understand you want to have 10 elements and that when you select one, the background of that element changes to indicate that only that one is selected and the previous one is the same as the others.

Change your onBindViewHolder to this:

@Override
public void onBindViewHolder(final ViewHolder viewHolder, int position) {
    viewHolder.textView.setId(items.get(viewHolder.getAdapterPosition()).getItemID());
    viewHolder.textView.setText(items.get(viewHolder.getAdapterPosition()).getNumber());

    if(seleccionado == position){
        viewHolder.fondo.setBackground(ContextCompat.getDrawable( activity, R.drawable.background_select));
    }else {
        viewHolder.fondo.setBackground(ContextCompat.getDrawable(activity, R.drawable.background_unselect));
    }

    viewHolder.textView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (onItemClickListener != null)
                onItemClickListener.onClick(position, viewHolder);
            seleccionado= position;
            notifyDataSetChanged();
        }
    });
}

You can keep a variable with the name you want in this case I have called it selected and the start with -1, then when the onItemClickListener is executed it is changed selected to the position to which it was clicked and we call the notifyDataSetChanged(); that basically will make all the visible elements go through the onBindViewHolder by repainting the background of each element.

I hope I helped you.

    
answered by 05.07.2017 / 19:31
source