自定义阵列适配器不仅仅是第一个元素不同



>我正在努力制作一个自定义的 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;
}

最新更新