我正在尝试根据不同的状态更改特定行的颜色。这是我目前的代码。
public View getView(int position, View convertView, ViewGroup parent) {
View row=convertView;
if (row==null) {
LayoutInflater inflater=getLayoutInflater();
row=inflater.inflate(R.layout.doit, parent, false);
}
TextView label = (TextView) row.findViewById(R.id.mess);
label.setText(ArrayAdapter.getItem(position));
switch(mState){
case STATE1:
label.setTextColor(Color.WHITE);
break;
case STATE2:
label.setTextColor(Color.BLACK);
break;
case STATE3:
label.setTextColor(Color.YELLOW);
break;
}
return(row);
}
}
代码有点工作..但它会改变所有行。有什么想法吗?
答案 0 :(得分:3)
所以android每次都会重复使用View,这就是为什么你看到它会影响所有行。您需要做的是明确设置每种情况的颜色。或许在你的switch语句中添加一个'default'case,以便它将它设置为布局中默认的任何内容?
答案 1 :(得分:1)
mState来自哪里?我不认为它来自物体,所以它如何改变价值?如果因为每行调用getView()而无法更改值,则颜色无法更改。我期待以下内容:
MyItem item = getItem( position );
switch( item.getState() ) {
case STATE_1:
label.setTextColor( R.color.white );
break;
case STATE_2:
label.setTextColor( R.color.red );
break;
case STATE_3:
label.setTextColor( R.color.green );
break;
default:
label.setTextColor( R.color.black );
break;
}
记住Ben声明必须重置颜色,这样如果您的行不能处于1,2或3状态,则需要在switch语句中添加默认分支。
通常很好的做法是从行对象中获取用于制作渲染决策的信息。
答案 2 :(得分:-1)
发现一些关于ArrayAdapter
的奇怪事情。向适配器添加内容时,会多次调用getView()
方法。它正在为ArrayAdapter中的每个项目调用,这很奇怪。这就是案例开关不起作用的原因。当它遍历整个列表时,它仍然处于相同的状态。解决方案是找到像Ben建议的特殊行。像:
if (position == 2){ //Row 3 will be red
label.setTextColor(Color.RED)
}
我发现这很奇怪,但也许是他们如何实现它。