10

各セルにテキストを含む GridView があり、個々のセルの背景色を設定できるようにしたいと考えています。

私の GridView の XML は次のとおりです。

<GridView android:id="@+id/students_grid"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:numColumns="6"
          android:gravity="center"
          android:stretchMode="columnWidth">
</GridView>

私の GridView のコードは次のとおりです。

GridView gridView = (GridView) findViewById(R.id.students_grid);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, student_array);
gridView.setAdapter(adapter);

以下を使用して、個々のセルの背景色を設定できることを望んでいました。

gridView.getChildAt(random_student).setBackgroundColor(Color.parseColor("#18A608"));

ただし、これはヌル ポインター例外をスローし、さらに調べると、gridview.getChildCount() が 0 を返すようです。個々のセルの背景色。

私が次に行くアイデアはありますか?

4

3 に答える 3

10

この問題を解決する鍵は、まずその方法ListViewGridView働きを理解することです。GridView上下にスクロールすると、子ビューが作成および破棄されます。子ビューがないことを意味するアイテムがGridView表示されない場合は、ユーザーが実際にスクロールしたときに作成されます。GridViewを使用しAdapterてビューを作成し、ビューGridViewがオフスクリーンになったときにビューを再利用し、再利用されたビューを画面に表示される新しいビューに再利用するようアダプタに要求します。はAdapter通常、リソース レイアウトを拡張して新しいビューを作成します。

つまり、 は子ビューを画面に表示するたびにGridViewを呼び出しgetView(...)、と呼ばれる再利用されたビューを渡すことができます。AdapterconvertView

解決策は、をオーバーライドしgetView(...)、super を呼び出してAdapter、ビューを作成し、配列からのデータを通常どおり入力できるようにすることですが、ビューの色を設定するStringビューを元に戻す前に、最後にコードを少し追加します。GridView

new ArrayAdapter<String>(context, android.R.layout.simple_list_item_1, student_array) {
  @Override
  public View getView(int position, View convertView, ViewGroup parent) {
    View view = super.getView(position, convertView, parent);

    int color = 0x00FFFFFF; // Transparent
    if (someCondition) {
      color = 0xFF0000FF; // Opaque Blue
    }

    view.setBackgroundColor(color);

    return view;
  }
};
于 2014-06-27T17:47:05.830 に答える
-1

の代わりに、カスタム レイアウトを作成してアダプタで使用する必要がありますandroid.R.layout.simple_list_item_1。例えば:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
    android:paddingRight="?android:attr/listPreferredItemPaddingRight"
    android:minHeight="?android:attr/listPreferredItemHeightSmall"
    android:background="#18A608"
     />

(最新バージョンをコピーしてsimple_list_item_1.xml、最後に新しい背景色を追加しただけです。)

これをそのまま保存し、アダプターのコンストラクターを次のようgrid_layout.xmlres/layout変更します。

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.grid_layout, student_array);
于 2012-10-14T19:55:59.657 に答える