Как изменить цвет фона для определенных элементов виджета в RecycleView?

1

Я пытаюсь изменить цвет фона в определенных элементах в 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);
                }

Работает нормально за исключением того, что после прокрутки теряется смена фона.

Так как мы хотим и нуждаемся в совершенстве, есть идеи для сохранения даже после прокрутки?

Теги:
android-recyclerview
android-viewholder

3 ответа

2

привет попробуйте добавить это в свой адаптер, это может решить вашу проблему.

@Override
    public int getItemViewType(int position) {
        return position;
    }
  • 0
    Спасибо вам за помощь. Выдает android.content.res.Resources $ NotFoundException: идентификатор ресурса # 0x1a. Пытаюсь это выяснить.
0

В 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.

  • 0
    Как я уже сказал, это не работает. Изменяет значения на ЛЮБОЙ видимый элемент, который имеет позицию 1,2,3 во время прокрутки. Это рейтинговый список, и я хочу, чтобы он выделил ТОЛЬКО «Первый элемент». Мне удалось, если вы проверили последнее обновление с помощью findFirstVisibleItemPosition (). Единственная проблема заключается в том, что он теряет изменения при прокрутке назад. Попытка найти решение для этого.
  • 0
    Пожалуйста, поделитесь своим кодом, как я описал
Показать ещё 1 комментарий
0

Пожалуйста, дайте это попробовать

переопределить в вашем пользовательском адаптере

@Override
public long getItemId(int position) {
    return position;
}

и в вашем адаптере объект:

myAdapter.setHasStableIds(true);
  • 0
    Я не использую пользовательский адаптер. Как вы можете видеть в коде адаптера, я использую FirebaseRecycleAdapter, который почти такой же, как и в RecycleAdapter. у него уже есть getItemId, getViewType. Но я не знаю, как использовать его, чтобы получить только первый элемент.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню