更改ArrayAdapter ListView Android中的特定行

时间:2010-07-21 14:51:52

标签: android listview android-arrayadapter

我正在尝试根据不同的状态更改特定行的颜色。这是我目前的代码。

 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);
 }

}

代码有点工作..但它会改变所有行。有什么想法吗?

3 个答案:

答案 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)
}

我发现这很奇怪,但也许是他们如何实现它。