如何将背景颜色更改为RecycleView中的特定视图项?

问题描述 投票:1回答:3

我试图在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));
}

这就像我想要的那样,并且realRanktakes正确的值,和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();gives一个数字(1,2,3,4,5,6等)为什么我不能使用这个数字来检查相等?

注意

将此代码保留为NOT工作解决方案,仅供将来参考:

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

除了滚动失去背景的更改后,工作正常。

因此,我们想要并且需要完美,任何想法,甚至滚动后保持?

java android android-recyclerview android-viewholder
3个回答
2
投票

嗨尝试在您的Adapater中添加它可以解决您的问题。

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

0
投票

请试一试

在自定义适配器中覆盖

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

并在您的适配器对象中:

myAdapter.setHasStableIds(true);

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

© www.soinside.com 2019 - 2024. All rights reserved.