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);
}
}