我正在制作一个自定义的ArrayAdapter,以便我的列表中的第一个元素具有不同的颜色。
问题是,当我在get view方法中执行此代码时:
@Override
public View getView(int position, View convertView, ViewGroup parent){
Club club = (Club)getItem(position);
if(convertView == null){
convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false);
}
TextView textView = (TextView)convertView.findViewById(R.id.txtListItem);
if(position == 0 && club.getName().contains("All")){
textView.setTextColor(ContextCompat.getColor(getContext(), R.color.orange));
}
textView.setText(club.getName());
return convertView;
}
第一项是橙色,是的,但是当我向下滚动时,第10项(屏幕下方)也是:(在另一个列表中,元素多于屏幕可以容纳的元素,我有几个是橙色的......我不明白为什么,请帮忙!
答案 0 :(得分:1)
这种情况正在发生,因为视图正在回收/重复使用。您正在为第一个项目设置橙色,但不为其余项目设置默认颜色。只需在上面的else
语句中添加if
子句,就像这样
if(position == 0 && club.getName().contains("All")){
Log.d(ClubAdapter.class.getName(), club.getName());
textView.setTextColor(ContextCompat.getColor(getContext(), R.color.orange));
}else{
textView.setTextColor(ContextCompat.getColor(getContext(), R.color.your_default_color));
}
答案 1 :(得分:0)
最有可能发生这种情况,因为Android正在回收最初用于第一行的视图。您需要else
子句将颜色设置为正常颜色。
答案 2 :(得分:0)
这是因为适配器尝试重用尽可能多的视图以提高性能。这就是为什么你不应该在getView中创建一个视图,而是重用它们(只有在它为null时才创建):
if(convertView == null){
convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false);
}
即使您不应该创建新视图,也必须确保为每个getView调用设置所需的参数(也称为"绑定"),所以:
if(position == 0){
//set your first view color and whatever
}else{
//set your common view colors..
}
答案 3 :(得分:0)
因为listview回收视图Google建议使用ViewHolder模式。如果单元格不同,您还应该设置默认颜色。它看起来像这样。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if(convertView == null){
convertView = LayoutInflater.from(context).inflate(R.layout.list_item, parent, false);
viewHolder = new ViewHolder();
viewHolder.textView = (TextView) convertView.findViewById(R.id.txtListItem);
convertView.setTag(viewHolder);
}
else {
viewHolder = (ViewHolder) convertView.getTag();
}
if(position == 0 && club.getName().contains("All")){
viewHolder.textView.setTextColor(ContextCompat.getColor(getContext(), R.color.orange));
}else{
//Set default color
}
viewHolder.textView.setText(club.getName());
return convertView;
}
static class ViewHolder {
protected TextView textView;
}