web-dev-qa-db-ja.com

個々のグリッドビューセルの背景色を設定する方法

各セルにテキストが含まれている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がグリッドビュー内のアイテムの数を正しく返すことを確認しましたが、これは設定に役立ちません個々のセルの背景色。

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

9
Mark__C

この問題を解決するための鍵は、最初にListViewGridViewがどのように機能するかを理解することです。 GridViewは、上下にスクロールすると子ビューを作成および破棄します。 GridViewにアイテムが表示されない場合、つまり子ビューがない場合は、ユーザーが実際にスクロールしたときにアイテムが作成されます。 GridViewAdapterを使用してビューを作成し、GridViewはビューが画面外に出たときにビューをリサイクルし、アダプターに、画面に表示される新しいビューにリサイクルされたビューを再利用するように要求します。 Adapterは通常、リソースレイアウトを拡張して、新しいビューを作成します。

つまり、GridViewは、子ビューを画面に表示するたびにAdaptergetView(...)を呼び出し、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;
  }
};
8
satur9nine

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;
    }
}
3
Suhas