自定义ArrayAdapter不只是第一个元素不同

时间:2016-01-28 19:14:46

标签: android listview

我正在制作一个自定义的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项(屏幕下方)也是:(在另一个列表中,元素多于屏幕可以容纳的元素,我有几个是橙色的......我不明白为什么,请帮忙!

4 个答案:

答案 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;

}