Android 更改ArrayAdapter ListView中的特定行
我正在尝试根据不同的状态更改特定行的颜色。这是我目前掌握的密码Android 更改ArrayAdapter ListView中的特定行,android,listview,android-arrayadapter,Android,Listview,Android Arrayadapter,我正在尝试根据不同的状态更改特定行的颜色。这是我目前掌握的密码 public View getView(int position, View convertView, ViewGroup parent) { View row=convertView; if (row==null) { LayoutInflater inflater=getLayoutInf
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);
}
}
代码有点工作..但是它改变了所有的行。有什么想法吗?所以android每次都会重用视图,这就是为什么您看到它会影响所有行。您需要做的是为每个案例显式设置颜色。也许可以在switch语句中添加一个“default”大小写,以便它将其设置为布局中的默认值?发现了一些关于
阵列适配器的奇怪之处。向适配器添加内容时,getView()
方法会被多次调用。ArrayAdapter中的每一项都会被调用,这很奇怪。这就是机箱开关不工作的原因。当它遍历整个列表时,它仍然处于相同的状态。解决方法是像Ben建议的那样找到您的特殊行。比如:
if (position == 2){ //Row 3 will be red
label.setTextColor(Color.RED)
}
我觉得这很奇怪,但也许这就是他们实现它的方式。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语句添加默认分支
通常,从row对象获取用于做出渲染决策的信息是一种很好的做法。如果要更改某个特定的行,必须有一种识别它的方法。通过适配器中对象的id或属性,或者如果您知道它的位置…您明白我的意思吗?我遇到了与您相同的问题,今天早些时候设法解决了它。看看我的问题和答案。嗨!安斯威尔的坦克。我不知道我怎样才能做到这一点。我知道显式更改行的颜色可以解决问题…但我不知道怎么做。如果在switch语句中添加“default:”大小写并在其中调用label.setTextColor(),应该可以解决问题。基本上我的意思是,如果要做的事情只影响某些行,那么还需要处理其他行。i、 e.不要这样做:if(position==MY_SPECIAL_ROW){//setTextColor()}
你应该这样做:`if(position==MY_SPECIAL_ROW){//setTextColor()}else{//setDefaultTextColor();}这真是个糟糕的建议。永远不要将颜色硬编码到列表中的位置。