我正在尝试在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);
}
工作正常,除了滚动后松开背景更改。
那么,当我们想要并需要完美时,有什么想法可以保持滚动?
答案 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
中的参数。