【问题标题】:How to change background colour to specific viewholder items in a RecycleView?如何将背景颜色更改为 RecyclerView 中的特定视图项?
【发布时间】:2019-02-18 19:10:23
【问题描述】:

我正在尝试更改 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)equality,也使用realRankequality) 在所有情况下,我都有相同的结果。颜色在 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);
                }

工作正常,除了滚动后失去背景变化。

既然我们想要并且需要完美,有什么想法可以在滚动后保持吗?

【问题讨论】:

  • 添加这个覆盖方法getItemViewType并检查是否工作
  • @JinsLukose 将其添加到视图中?你能更具体一些吗
  • 是的,在您的适配器类中。这是一个被覆盖的函数
  • @JinsLukose 我不使用自定义适配器。代码是RankingViewHolder和adapter = new FirebaseRecyclerAdapter(Ranking.class, R.layout.layout_ranking, RankingViewHolder.class,rankingTbl.orderByChild("score").limitToFirst(100)

标签: java android android-recyclerview android-viewholder


【解决方案1】:

您好,尝试将其添加到您的适配器中,它可能会解决您的问题。

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

【讨论】:

  • 感谢您的帮助。它抛出 android.content.res.Resources$NotFoundException: Resource ID #0x1a。试图弄清楚。
【解决方案2】:

请试一试

在您的自定义适配器中覆盖

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

并在您的适配器对象中:

myAdapter.setHasStableIds(true);

【讨论】:

  • 我不使用自定义适配器。正如您在适配器代码中看到的那样,我使用 FirebaseRecycleAdapter,这与 RecycleAdapter 几乎相同。它已经有 getItemId、getViewType。但我不知道如何使用它来获得第一个项目。
【解决方案3】:

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中的一个参数。

【讨论】:

  • 正如我所说,这是行不通的。将值更改为滚动时位置为 1、2、3 的任何可见项目。它是一个排名列表,我只想要第一个项目“突出显示。如果您使用 findFirstVisibleItemPosition() 检查上次更新,我会管理它。唯一的问题是当您向后滚动时它会丢失更改。试图为此找到解决方案。
  • 查看我的通知。正如我所说的,无论与位置有关,每 3 个可见项目都会改变颜色。我只需要更改前 3 个项目。所以唯一可行的解​​决方案是 findFirstVisibleItemPosition() 并进行计数。除了向后滚动我目前正在工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
相关资源
最近更新 更多