2016-12-10 31 views
0

getMatchで指定された整数値に基づいて、RecyclerView内のリストアイテム内のテキストビューの背景色を変更しようとしています。このメソッドは0〜100の間のint値を返します。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]の範囲内であるという事実に関係している疑いがあるが、私は」それ以外はどこに実装するのかわからない

EDITEDIT パッケージ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

** ViewHolder **パターンを使用しているときに 'matchPercentage'がここで初期化される理由 –

答えて

2

宣言matchPercentageと

holder.matchPercentage.setBackgroundResourceとしてonBindViewHolderで使用リサイクラビューがリサイクラビュー内の1つのエントリのビューへの参照を格納するViewHolderを使用するためです。 ViewHolderクラスは、アダプターの関連するビューへの参照を保持する静的内部クラスです。これらのリファレンスを使用すると、時間がかかるfindViewById()メソッドを回避してウィジェットを新しいデータで更新できます。

+0

素晴らしい作品。答えをありがとう –

関連する問題