Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/182.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 更改ArrayAdapter ListView中的特定行_Android_Listview_Android Arrayadapter - Fatal编程技术网

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();}这真是个糟糕的建议。永远不要将颜色硬编码到列表中的位置。