1

基本的にボタンのように見えるカスタムビューを持つ GridView があります。グリッドビューは子なしで開始され、ユーザーがボタンを押すたびに別のカスタム ビューが追加されます。

これにはいくつかの奇妙な動作があります。onDraw のカスタム ビューでテキストや線などを描画していますが、まったく描画されないこともあります。それらは完全に空白です。描画されたグラフィックスを表示するビューと表示しないビューに関して、動作は非常にランダムに見えます。

レイアウトパラメータを設定することに関係しているように感じます。子ビューを作成したら配列に格納し、getView() で位置パラメーターに関連するビューを返します。そのため、各位置のボタンを一度だけ作成します。

そこで、質問が 2 つあります。

  1. これを引き起こすために私は何をしていますか?

  2. 私がしていることにグリッドビューを使用する必要がありますか?

ビューを取得するためのコードは次のとおりです。

public View getView(int position, View convertView, ViewGroup parent) 
    {
        GridButton button;
        GridView gridView = (GridView)parent;
        if(childBuittons.size() <= position) //if we need to create a new button
        {
                button = createButton(position);
                int nWidth = getButtonSize(gridView);
                GridView.LayoutParams params = new GridView.LayoutParams(nWidth, nWidth);
                button.setLayoutParams(params);
        }
        else //we already have a button that we created
        {
            button = buttons.get(position);
        }
        return button;
    }

いくつかの詳細情報: - gridbutton クラスは、View を拡張し、onDraw をオーバーライドしてテキストや線などのグラフィックを描画する単なるクラスです。これは頻繁に行われます) そして、四角形を押して特定の機能を実行します - 画面に収まりきらないほど多くの四角形が存在する可能性があります

4

1 に答える 1

0

これを引き起こすために私は何をしていますか?

GridButtonクラスに関連する詳細を提供しないと、誰も実際にあなたを助けることはできません。ビューの測定をどのように処理し、そのビューに何を(そしてどのように)正確に描画するかを知っておくとよいでしょう。

レイアウトパラメータの設定と関係があると感じています。

私はこれを疑う。そのカスタムビューで単純な色を描画して、それがグリッドに表示されるかどうかを確認することもできます。もしそうなら、それはLayoutParams何が起こっているのかという理由ではありません。また、の値を確認してくださいnWidth

子ビューが作成されたら配列に格納し、getView()でpositionパラメーターに関連するビューを返します。そのため、各位置のボタンを作成するのは1回だけです。

これは大丈夫ではありません。を使用する主な理由GridViewは、アダプターを使用して、すべてのグリッドビュー(メモリを占有し(クラッシュしない場合)を占有し、アプリの速度を低下させる)を事前に作成する必要がないようにすることができるためです。GridView/に固有の適切なリサイクルメカニズムの実装を検討する必要がありますListView。メソッドgetView()は次のようになります。

View getView(int position, View convertView, ViewGroup parent) {
    GridButton button;
    GridView gridView = (GridView)parent;
    if(convertView == null) {
            button = createButton(position);
            int nWidth = getButtonSize(gridView);
            GridView.LayoutParams params = new GridView.LayoutParams(nWidth, nWidth);
            button.setLayoutParams(params);
    } else {
        button = (GridButton) convertView;
    }
    return button;
}

これらのボタンにアクセスする必要がある場合は、アダプターを介してボタンにアクセスし、ボタンの位置に応じてデータを変更し、を呼び出しnotifyDataSetChanged()ます。

私がしていることにグリッドビューを使用する必要がありますか?

あなたはあなたがしたいことを言いませんでした。セルの数が十分に多く、すべてのセルが表示されないと予想される場合は、を使用しGridViewます。すべてのセルが表示されると思われる場合は、。なしの標準レイアウトを使用してそのグリッドを作成できますGridView

于 2013-02-24T15:33:12.893 に答える