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

についていくつかの奇妙なことを発見しましたArrayAdapter。アダプターに何かを追加すると、getView()メソッドが複数回呼び出されます。奇妙な ArrayAdapter の各項目に対して呼び出されます。これが case-switch が機能しない理由です。リスト全体を反復しても、同じ状態のままです。解決策は、ベンが提案したような特別な行を見つけることです。お気に入り:

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

これは奇妙だと思いますが、おそらくそれが彼らの実装方法です。

于 2010-07-22T19:53:37.740 に答える