Android Listview改变了certian职位的颜色

时间:2017-02-16 12:34:24

标签: java android listview colors

我有一个适配器从检索到的json填充我的Listview。 我想根据位置改变某些单元格的颜色,即位置1蓝色位置2红色等。但是使用当前代码我得到了所需的效果但是当我向下滚动列表时它会重复。我知道这是因为视图令人耳目一新,但不确定如何修复它。

public class ListAdapter extends BaseAdapter {

MainActivity main;

ListAdapter(MainActivity main) {
this.main = main;
}

@Override
public int getCount() {
return  main.countries.size();
}

@Override
public Object getItem(int position) {
return null;
}

@Override
public long getItemId(int position) {
return 0;
}

static class ViewHolderItem {
TextView name;
TextView code;
TextView pts;

}

@Override
public View getView(int position, View convertView, ViewGroup parent){
ViewHolderItem holder = new ViewHolderItem();
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) main.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
       convertView = inflater.inflate(R.layout.cell, null);

       holder.name = (TextView) convertView.findViewById(R.id.name);
       holder.code = (TextView) convertView.findViewById(R.id.code);
       holder.pts = (TextView) convertView.findViewById(R.id.pts);

       convertView.setTag(holder);
}
else  { 
          holder = (ViewHolderItem) convertView.getTag();
}

holder.name.setText(this.main.countries.get(position).name);
holder.code.setText(this.main.countries.get(position).code);
holder.pts.setText(this.main.countries.get(position).pts);

 if (position == 1) { 
holder.name.setBackgroundColor(Color.parseColor("#FFFFFF"));

}

return convertView;

}

}

2 个答案:

答案 0 :(得分:0)

如果我理解正确 - 你会反复看到这种颜色而不仅仅是位置1。 这可能发生,因为您正在重新使用getView中给出的convertView,这意味着您获得了一个已经创建且已经使用过的View,它具有背景颜色并具有较旧的属性,并且您为其提供了新的属性和数据。 因此,在这种情况下 - 它可能具有旧颜色,并且因为您没有为每个位置赋予颜色,所以颜色会粘在它上面。

我认为在这种情况下 -

switch(position){
     case 1:
          holder.name.setBackgroundColor(Color.parseColor("#FFFFFF"));
          break;
     case 2:
          holder.name.setBackgroundColor(Color.parseColor("#EEEEEE"));
          break;
     case 3:
          holder.name.setBackgroundColor(Color.parseColor("#000000"));
          break;
     case 4:
          holder.name.setBackgroundColor(Color.parseColor("#DDDDDD"));
          break;
     case default:
          holder.name.setBackgroundColor(Color.parseColor("#ABCDEF"));
          break;
}

将解决回收的颜色问题。 (根据需要在开关选择范围中添加任意数量的颜色,或者如上所述创建颜色数组并根据位置进行更改。

答案 1 :(得分:0)

列表中的视图已被回收。滚动到熨平板外的项目视图在滚动到屏幕中的项目中重复使用。使用这样的代码。

if (position == 1) {
  holder.name.setBackgroundColor(Color.parseColor("#FFFFFF"));
} else {
  holder.name.setBackgroundColor(...)   
}

或者,如果您想仅按两种颜色划分列表:

if(position % 2 == 0) view.setBackgroundColor(Color.rgb(224, 224, 235));
if(position % 2 == 1) view.setBackgroundColor(The normal color you should set);