Я пытаюсь изменить цвет фона в определенных элементах в 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-х первых видимых элементов, как и прежде, то есть 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);
}
Работает нормально за исключением того, что после прокрутки теряется смена фона.
Так как мы хотим и нуждаемся в совершенстве, есть идеи для сохранения даже после прокрутки?
привет попробуйте добавить это в свой адаптер, это может решить вашу проблему.
@Override
public int getItemViewType(int position) {
return position;
}
В populateViewHolder
добавьте эти строки кода
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);
}
position - это параметр в populateViewHolder
.
Пожалуйста, дайте это попробовать
переопределить в вашем пользовательском адаптере
@Override
public long getItemId(int position) {
return position;
}
и в вашем адаптере объект:
myAdapter.setHasStableIds(true);