Reputation: 106
I am attempting to change the background color of a textview within a list item inside a RecyclerView based on an integer value given through getMatch
. This method returns an int value between 0-100.
The code I have posted below works with the initial list items that are created, but when an item is deleted (by swiping left to right) and a new list item is created, the color is incorrect. Also as more are deleted, the previous items (once correct) change color to an incorrect color. I'm not sure what is wrong with my my methodology and would appreciate some correction and guidance on the matter. I am hoping for a better implementation of a solution all together.
Code within my Adapter:
@Override
public void onBindViewHolder(Holder holder, int position) {
List_Item item = listData.get(position);
holder.name.setText(item.getName());
holder.age.setText(item.getAge());
int match = item.getMatch();
holder.match.setText("" + match + "%");
TextView matchPercentage = (TextView) v.findViewById(R.id.match_text_view);
if (match>=85){
matchPercentage.setBackgroundResource(R.color.match_blue);
}else if (match>=75 && match<85){
matchPercentage.setBackgroundResource(R.color.match_green);
}else if (match>=60 && match<75){
matchPercentage.setBackgroundResource(R.color.match_yellow_green);
}else if (match>=50 && match<60){
matchPercentage.setBackgroundResource(R.color.match_yellow);
}else if (match>=40 && match<50){
matchPercentage.setBackgroundResource(R.color.match_orange);
}else if(match<40 && match>=0){
matchPercentage.setBackgroundResource(R.color.match_red);
}
If anyone is wondering, the holder.match.setText
is always the correct integer.
Initially Correct:
After deleting a few:
I suspect the issue has to do with the fact that this code is within onBind, but I'm not sure where else to implement it
EDIT package andrewnguyen.finishedmoietyapp.recyclerview;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
import andrewnguyen.finishedmoietyapp.Global;
import andrewnguyen.finishedmoietyapp.R;
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.Holder> {
private View v;
private List<List_Item> listData;
private LayoutInflater inflater;
private ItemClickCallback itemClickCallback;
public interface ItemClickCallback {
void onItemClick(View v, int p);
void onSecondaryIconClick(int p);
}
public void setItemClickCallback(final ItemClickCallback itemClickCallback) {
this.itemClickCallback = itemClickCallback;
}
public RecyclerViewAdapter(List<List_Item> listData, Context c) {
inflater = LayoutInflater.from(c);
this.listData = listData;
}
@Override
public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
//Sets the holder for the list items
View view = inflater.inflate(R.layout.list_item_layout, parent, false);
v = view;
Global global = new Global();
int height = global.getScreenHeight() / 5;
int width = global.getScreenWidth() / 5;
RelativeLayout rl = (RelativeLayout) view.findViewById(R.id.container_of_list_item);
rl.getLayoutParams().height = height;
ImageView profilePic = (ImageView) view.findViewById(R.id.profile_pic_image_view);
profilePic.getLayoutParams().width = width;
TextView matchPercentage = (TextView) view.findViewById(R.id.match_text_view);
matchPercentage.getLayoutParams().width = global.getScreenWidth() / 4;
TextView fullname = (TextView) view.findViewById(R.id.name_text_view);
fullname.setWidth(width * 4);
fullname.setPadding(width + 20, height / 5, 0, 0);
TextView age = (TextView) view.findViewById(R.id.age_text_view);
age.setWidth(width * 4);
age.setPadding(width + 20, 0, 0, 0);
return new Holder(view);
}
@Override
public void onBindViewHolder(Holder holder, int position) {
List_Item item = listData.get(position);
holder.name.setText(item.getName());
holder.age.setText(item.getAge());
int match = item.getMatch();
holder.match.setText("" + match + "%");
Toast.makeText(v.getContext(), ""+ match,
Toast.LENGTH_LONG).show();
TextView matchPercentage = (TextView) v.findViewById(R.id.match_text_view);
if (match>=85){//DOESN"T WORK WELL...
matchPercentage.setBackgroundResource(R.color.match_blue);
}else if (match>=75 && match<85){
matchPercentage.setBackgroundResource(R.color.match_green);
}else if (match>=60 && match<75){
matchPercentage.setBackgroundResource(R.color.match_yellow_green);
}else if (match>=50 && match<60){
matchPercentage.setBackgroundResource(R.color.match_yellow);
}else if (match>=40 && match<50){
matchPercentage.setBackgroundResource(R.color.match_orange);
}else if(match<40 && match>=0){
matchPercentage.setBackgroundResource(R.color.match_red);
}
}
@Override
public int getItemCount() {
return listData.size();
}
class Holder extends RecyclerView.ViewHolder implements View.OnClickListener{
ImageView thumbnail;
//ImageView secondaryIcon;
TextView name;
TextView age;
TextView match;
View container_of_list_item;
public Holder (View itemView) {
super(itemView);
match = (TextView)itemView. findViewById(R.id.match_text_view);
thumbnail = (ImageView)itemView.findViewById(R.id.profile_pic_image_view);
// secondaryIcon = (ImageView)itemView.findViewById(R.id.im_item_icon_secondary);
// secondaryIcon.setOnClickListener(this);
age = (TextView)itemView.findViewById(R.id.age_text_view);
name = (TextView)itemView.findViewById(R.id.name_text_view);
container_of_list_item = itemView.findViewById(R.id.container_of_list_item);
container_of_list_item.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.container_of_list_item){
itemClickCallback.onItemClick(v, getAdapterPosition());
} else {
itemClickCallback.onSecondaryIconClick(getAdapterPosition());
}
}
}
}
Upvotes: 0
Views: 2305
Reputation: 102
declare matchPercentage in ViewHolder constructor and use in onBindViewHolder as holder.matchPercentage.setBackgroundResource
This is because Recycler view uses a ViewHolder to store references to the views for one entry in the recycler view. A ViewHolder class is a static inner class in your adapter which holds references to the relevant views. With these references your code can avoid the time-consuming findViewById() method to update the widgets with new data.
Upvotes: 2