【发布时间】: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