3

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

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

}

代码有点工作..但它改变了所有的行。有任何想法吗?

4

3 回答 3

3

所以android每次都重用视图,这就是为什么你看到它影响所有行的原因。您需要做的是为每种情况明确设置颜色。也许在您的 switch 语句中添加一个“默认”案例,以便将其设置为布局中的默认值?

于 2010-07-21T15:39:40.853 回答
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 语句中添加一个默认分支。

从行对象中获取用于做出渲染决策的信息通常是一种很好的做法。

于 2010-09-16T04:14:46.207 回答
-1

发现关于 a 的一些奇怪的事情ArrayAdapter。当您向适配器添加内容时,该getView()方法会被多次调用。ArrayAdapter 中的每个项目都会调用它,这很奇怪。这就是 case-switch 不起作用的原因。当它遍历整个列表时,它仍将处于相同状态。解决方案是像 Ben 建议的那样找到您的特殊行。喜欢:

if (position == 2){ //Row 3 will be red
label.setTextColor(Color.RED)
}

我觉得这很奇怪,但也许这就是他们实现它的方式。

于 2010-07-22T19:53:37.740 回答