各セルにテキストが含まれている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"));
ただし、これはnullポインター例外をスローし、さらに詳しく調べると、gridview.getChildCount()が0を返すようです。gridview.getCountがグリッドビュー内のアイテムの数を正しく返すことを確認しましたが、これは設定に役立ちません個々のセルの背景色。
次に行くアイデアはありますか?
この問題を解決するための鍵は、最初にListView
とGridView
がどのように機能するかを理解することです。 GridView
は、上下にスクロールすると子ビューを作成および破棄します。 GridView
にアイテムが表示されない場合、つまり子ビューがない場合は、ユーザーが実際にスクロールしたときにアイテムが作成されます。 GridView
はAdapter
を使用してビューを作成し、GridView
はビューが画面外に出たときにビューをリサイクルし、アダプターに、画面に表示される新しいビューにリサイクルされたビューを再利用するように要求します。 Adapter
は通常、リソースレイアウトを拡張して、新しいビューを作成します。
つまり、GridView
は、子ビューを画面に表示するたびにAdapter
でgetView(...)
を呼び出し、convertView
と呼ばれる再利用されたビューを渡す可能性があります。
解決策は、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;
}
};
16進カラーコードの配列を作成し、カスタムアダプタクラスに渡す必要がある主なアクティビティ
public class MainActivity extends Activity {
GridView gridView;
String[] gridColor ={
"#008B8B",
"#00FF00",
"#48D1CC",
"#556B2F",
"#696969",
"#6B8E23",
"#8FBC8F",
"#AFEEEE",
"#B8860B",
"#BDB76B",
"#D8BFD8",
"#DEB887",
"#FFFF00",
"#FFF0F5",
"#EE82EE",
"#DC143C",
"#C0C0C0"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Grid adapter = new Grid(MainActivity.this,gridColor);
gridView=(GridView)findViewById(R.id.grid_view);
gridView.setAdapter(adapter);
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id)
{
Toast.makeText(MainActivity.this, "You Clicked On " +gridcolor[+ position], Toast.LENGTH_SHORT).show();
}
});
}
}
カスタムアダプタコードでは、カラーコードが解析されるこのようになります
public class Grid extends BaseAdapter {
private Context mContext;
private final String[] menu;
private final int[] Imageid;
private final String[] gridcolor;
public Grid(Context context,String[] menu,int[] Imageid,String[] gridcolor)
{
mContext=context;
this.gridcolor=gridcolor;
}
@Override
public int getCount() {
return gridcolor.length;
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
View grid;
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (view == null) {
grid = new View(mContext);
grid = inflater.inflate(R.layout.grid_layout, null);
grid.setBackgroundColor(Color.parseColor(gridcolor[i]));
} else
{
grid = view;
}
return grid;
}
}