我试图在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
takes正确的值,和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,realRank
equality)在所有情况下我都有相同的结果。颜色在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);
}
除了滚动失去背景的更改后,工作正常。
因此,我们想要并且需要完美,任何想法,甚至滚动后保持?
嗨尝试在您的Adapater中添加它可以解决您的问题。
@Override
public int getItemViewType(int position) {
return position;
}
请试一试
在自定义适配器中覆盖
@Override
public long getItemId(int position) {
return position;
}
并在您的适配器对象中:
myAdapter.setHasStableIds(true);
在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
中的参数。