如何在RecycleView中将背景颜色更改为特定的Viewholder项目?

时间:2019-02-18 19:10:24

标签: java android android-recyclerview android-viewholder

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

工作正常,除了滚动后松开背景更改。

那么,当我们想要并需要完美时,有什么想法可以保持滚动?

3 个答案:

答案 0 :(得分:2)

您可以尝试将其添加到您的Adapater中,这可能会解决您的问题。

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

答案 1 :(得分:0)

请尝试一下

覆盖您的自定义适配器

var DataSource = new kendo.data.DataSource({
      transport: {
      read: {
      url: function() {
      return "/URI";
      },
      dataType: "json"
      }
      },

      group: {
      field: "Date"
      },

      sort: {
      field: "Date",
      dir: "asc"
      },

      schema: {
      model: {
      fields: {
      date: {
      type: "date"
      }
      }
      }
      }
      });

      function createChart() {
      $("#chart1").kendoChart({
      dataSource: DataSource,
      legend: {
      position: "bottom"
      },
      series:
        [{
          field: "Images",
          categoryField: "Date",
          name: "Number of Images"
          }, {
          field: "ImagesDownloads",
          categoryField: "Date",
          name: "Number of Images download"
        }],
      categoryAxis: {
      field: 'Date'
      },
      tooltip: {
      visible: true,
      shared: true
      }
      });
      }

      $(document).ready(function () {


      $(document).ready(createChart);
      $(document).bind("kendo:skinChange", createChart);

并在您的适配器对象中:

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

答案 2 :(得分: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中的参数。