2016-12-10 117 views
0

我试图根据通过getMatch给出的整数值更改RecyclerView内的列表项中的textview的背景颜色。此方法返回0-100之间的整数值。RecyclerView:更改每个列表上Textview的背景颜色项目

我已经贴在下面与所创建的初始列表项工程的代码,但是当一个项目被删除(通过向左滑动到右),并创建一个新的列表项,颜色不正确。此外,随着更多内容被删除,以前的项目(一旦正确)会将颜色更改为不正确的颜色。我不确定我的方法有什么问题,并希望对此事进行一些更正和指导。我希望更好地实施解决方案。我的适配器内

代码:

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

如果你想知道,在holder.match.setText永远是正确的整数。

最初正确:

Correct

删除一些后:

enter image description here

我怀疑问题是与事实,这个代码是内onBind做的,但我不能确定还有什么地方来实现它

编辑 包andrewnguyen.finishedmoietyapp.recyclerview;在ViewHolder构造

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()); 
      } 
     } 
    } 
} 
+0

什么是'v'这里'v.findViewById(R.id.match_text_view);'? –

+0

查看v = inflater.inflate(R.layout.list_item_layout,parent,false); - 这是我的list_item的布局,位于我的适配器类的onCreateViewHolder中 –

+0

为什么'matchPercentage'在您使用** ViewHolder **模式时在此初始化 –

回答

2

声明matchPercentage和onBindViewHolder使用作为holder.matchPercentage.setBackgroundResource

这是因为回收站视图使用ViewHolder存储的参考意见在回收视图中的一个条目。 ViewHolder类是适配器中的静态内部类,它持有对相关视图的引用。通过这些引用,您的代码可以避免耗费时间的findViewById()方法来使用新数据更新窗口小部件。

+0

伟大的工作。感谢你的回答 –