Я пытаюсь изменить цвет фона для определенного элемента (ов) в RecycleView.Поскольку мне тоже нужно установить текст, у меня есть следующий код, который отлично работает:
protected void populateViewHolder(RankingViewHolder viewHolder, final Ranking model, int position)
{
final Context mContext = getActivity().getApplicationContext();
viewHolder.txt_name.setText(model.getUserName());
viewHolder.txt_score.setText(String.valueOf(model.getScore()));
viewHolder.txt_class.setText(model.getUser_class());
Picasso.with(mContext).load(model.getAvatarUrl()).error(R.drawable.ic_people_black_24dp).into(viewHolder.personPhoto);
int totalRanking = adapter.getItemCount();
int realRank = totalRanking - viewHolder.getAdapterPosition();
viewHolder.ranknumber.setText("# "+String.valueOf(realRank));
}
Это работает так, как я хочу, и realRank
принимает правильные значения, а viewHolder.ranknumber.setText("# "+String.valueOf(realRank));
Устанавливает правильный текст без проблем.
Теперь я пытаюсь (так как я получил правильное число / текстовый результат, чтобы сделать выражение if следующим образом:
if(adapter.getItemCount() -viewHolder.getAdapterPosition() == 0)
{
viewHolder.itemView.setBackgroundColor(Color.GREEN);
}
if(adapter.getItemCount() -viewHolder.getAdapterPosition() == 1)
{
viewHolder.itemView.setBackgroundColor(Color.YELLOW);
}
if(adapter.getItemCount() -viewHolder.getAdapterPosition() == 2)
{
viewHolder.itemView.setBackgroundColor(Color.BLUE);
}
(я пыталсяс равенством String.valueOf(realRank)
, с равенством realRank
тоже) Во всех случаях у меня один и тот же результат. Цвет меняется как положено в позициях 1,2,3, НО он меняется в позициях 7,8,9 и 14,15,16 и 21,22,23 и т. Д.
Что мне здесь не хватает?
public class RankingViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
{
private ItemClickListener itemClickListener;
public TextView txt_name, txt_score, txt_class, ranknumber;
public ImageView personPhoto;
public RankingViewHolder(View itemView)
{
super(itemView);
txt_name = itemView.findViewById(R.id.txt_name);
txt_score = itemView.findViewById(R.id.txt_score);
personPhoto = itemView.findViewById(R.id.person_photo);
txt_class = itemView.findViewById(R.id.txt_class);
ranknumber = itemView.findViewById(R.id.ranknumber);
itemView.setOnClickListener(this);
}
public void setItemClickListener(ItemClickListener itemClickListener) {
this.itemClickListener = itemClickListener;
}
@Override
public void onClick(View view) {
itemClickListener.onClick(view , getAdapterPosition(),false);
}
}
Адаптер:
adapter = new FirebaseRecyclerAdapter<Ranking, RankingViewHolder>(
Ranking.class,
R.layout.layout_ranking,
RankingViewHolder.class,
rankingTbl.orderByChild("score").limitToFirst(100)
)
Эта строка кода int realRank = totalRanking - viewHolder.getAdapterPosition();
даетчисло (1,2,3,4,5,6 и т. д.) Почему я не могу использовать этот номер для проверки равенства?
Уведомление
Сохранение этого кода дляНЕ рабочее решение, просто для дальнейшего использования:
if(position == 0){
viewHolder.itemView.setBackgroundColor(Color.GREEN);
}
else if(position == 1){
viewHolder.itemView.setBackgroundColor(Color.YELLOW);
}
else if(position == 2){
viewHolder.itemView.setBackgroundColor(Color.BLUE);
}
else{
viewHolder.itemView.setBackgroundColor(Color.WHITE);
}
Это меняет цвет, НО не только для первых 3 элементов. При прокрутке вниз изменяет цвет для каждых 3 первых видимых элементов lперед тем, как 1,2,3, 7,8,9 и т. д.
Обновление:
Я не использую пользовательский адаптер, я использую FirebaseRecyclerAdapter
,Благодаря комментарию @Muhammad Haroon я проверил, что есть getItemViewType.Так что теперь я пытаюсь с этим как
position =adapter.getItemViewType( 0);
if(position == 0){
viewHolder.itemView.setBackgroundColor(Color.GREEN);
}
Пока не работает, но я думаю, что это правильное направление ...
Обновление 2
С позицией это невозможно, так как RecycleView перерабатывает представления, поэтому у меня тот же результат.Рабочий код:
if (linearLayoutManager.findFirstVisibleItemPosition() > 0) {
viewHolder.itemView.setBackgroundResource(R.drawable.blackframe);
}
else{
viewHolder.itemView.setBackgroundResource(R.drawable.goldframe);
}
Работает нормально, за исключением того, что после прокрутки теряется смена фона.
Так как мы хотим и нуждаемся в совершенстве, есть идеи по поводу сохранения даже после прокрутки?