>我正在努力制作一个自定义的 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 项(屏幕下方)也是我向下滚动:(在另一个元素超过屏幕可以容纳的元素的列表中,我有几个是橙色的。我不明白为什么,请帮忙!
发生这种情况是因为视图正在回收/重用。您正在为第一项设置橙色,但没有为其余项设置默认颜色。只需在上面的if
语句中添加一个else
子句,如下所示
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));
}
发生这种情况很可能是因为Android正在回收最初用于第一行的视图。您需要一个 else
子句才能将颜色设置回正常颜色。
发生这种情况是因为适配器尝试重用尽可能多的视图以提高性能。这就是为什么你不应该在getView中创建视图,而是重用它们(仅在它为空时才创建):
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..
}
因为列表视图回收视图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;
}