Как изменить цвет фона для определенных элементов виджета в RecycleView? - PullRequest
0 голосов
/ 18 февраля 2019

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

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

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

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

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

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

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

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

myAdapter.setHasStableIds(true);
0 голосов
/ 22 февраля 2019

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

позиция является параметром в populateViewHolder.

0 голосов
/ 21 февраля 2019

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

@Override
    public int getItemViewType(int position) {
        return position;
    }
...