6

Gridview の次のコードがあります (カレンダーを作成するため)。

    <GridView
    android:id="@+id/calendar"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_above="@+id/rl1"
    android:layout_below="@+id/ll2"
    android:columnWidth="250dp"
    android:numColumns="7" >
    </GridView>

Grid_Cell は以下の通りです。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/calendar_button_selector" >

<Button
    android:id="@+id/calendar_day_gridcell"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/calendar_button_selector"
    android:gravity="center"
    android:textAppearance="?android:attr/textAppearanceSmall"
    android:textColor="#000"
    android:textSize="14.47sp" >
</Button>

<TextView
    android:id="@+id/num_events_per_day"
    style="@style/calendar_event_style"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center" >
</TextView>

行と列の間にスペースを入れないようにしたい。このような

既存のビューは次のとおりです。

既存の画像

私を助けてください...事前に感謝します。

4

5 に答える 5

4

GridView私は間違っているかもしれませんが、私が知る限りAdapterView、あなたの場合、xml を介して動的にアイテムの高さをフォーマットして、常に親全体を埋めることができないことを意味します。これは、グリッド ビュー (およびリスト ビューやその他のアダプター ビュー) が機能する方法ではありません。

この種の「スクロール可能なコンテナー ビュー」は、非常に昔に「最新のライブラリ」に存在していたマイクロフィルム リーダーと見なすことができます。データは実際のビューアーとはまったく関係がないことを認識する必要があります。ビューアー (GridViewあなたの場合) を使用して高さを固定し、幅と高さが固定されている下にあるデータ項目をパンします。

私が見ているように、データがたまたまビューアーウィンドウと同じ幾何学的サイズを持つ非常にコーナーケースを明示的にターゲットにしようとしています。

ただし、いくつかのヒント:

代わりに をご覧くださいGridLayout。はGridLayoutAPI レベル 14 (IceCream Sandwich) で導入されたので、そこでバージョン サポート戦略を再考する必要があるかもしれません (完全に誤解していなければ、古いプラットフォームでの下位互換性のために v7 サポート パッケージにも含める必要があります。その場合、古い API レベルをサポートするには、アプリに jar を追加するだけです)。

さらに別のヒントはTableLayout、対応するテーブル行とそうでないもので a を使用することです。はTableLayout初日から存在しているため、下位互換性の問題はありませんが、レイアウトが非常に集中的になる傾向があります。ビューを頻繁にリロードしたり、月間をスムーズにスクロールしたりすることを計画している場合、これが解決策であるかどうかはわかりません (深いレイアウト ルートの量のため)。

3 番目の解決策は、引き続き を使用することですがGridView、その高さを測定し、測定された高さに基づいて、グリッド ビュー アダプターから膨張したグリッド ビュー アイテムに固定の高さを動的に設定しますGridView(つまり、上記のコーナーケースを入力してください)。

を使用する場合GridViewは、垂直方向の間隔も削除する必要があります。で遊ぶことができるandroid:stretchMode属性があります。属性で別の (負の?) ディメンションを試すこともできます。GridViewandroid:verticalSpacing

カスタムカレンダービューで頑張ってください!

于 2012-12-05T13:56:48.313 に答える
4

スニペットを提供しようとしますが、正直なところ、すべてのアイテムが画面上にあるため、ケースに GridView を使用する意味はありません。LinearLayout結果を取得する小さなループでいくつかの を作成できます。

画面の幅に応じて、Runtime で columnWidth を設定することをお勧めします。

また、子ビューを膨張させるときに、アダプターに列の幅と高さを設定して、それらを設定する必要があります。この場合、numColumns を削除する必要があります。特にスペース全体を埋めたい場合は、numColumns を columnWidth と一緒に使用しても意味がないことに注意してください。numColumns を設定する場合は、columnWidth を削除します。

解決策:

結果は次のとおりです。 ここに画像の説明を入力 まず、レイアウトを作成します。私の場合、それはMainActivityのレイアウトであり、 と呼ばれactivity_main.xmlます。(後でコードに追加するため、GridView がないことに注意してください):

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/header"
        android:background="#444"
        android:gravity="center"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="@android:color/white"
        android:text="Dynamic Static GridView" />

    <TextView
        android:id="@+id/footer"
        android:gravity="center"
        android:background="#444"
        android:textColor="@android:color/white"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Shush" />

</RelativeLayout>

GridView 要素のレイアウトは次のitem_grid.xmlとおりです。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:background="#fff"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>

トリックは MainActivity にあります (理解できるようにコードの一部にコメントを付けました)。

パッケージcom.example.dynamicstaticgridview;

import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.RelativeLayout;
import android.app.Activity;
import android.graphics.Color;

/**
 * @author Sherif elKhatib
 *
 */
public class MainActivity extends Activity {

    private static String items[]; //these are temporary items :p do not use them
    static {
        items = new String[7*7];
        for(int i=0;i<7*7;i++) {
            items[i] = String.valueOf(i);
        }
    }

    int numberOfColumns = 7; //defaulting to 7, you can change it when you know
    int numberOfRows = 7; //defaulting to 7, you can change it when you know
    GridView mGrid;
    ArrayAdapter<String> mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
        params.addRule(RelativeLayout.BELOW, R.id.header);
        params.addRule(RelativeLayout.ABOVE, R.id.footer);
        mGrid = new GridView(this) {
            @Override
            protected void onLayout(boolean changed, int l, int t, int r, int b) {
                super.onLayout(changed, l, t, r, b);
                if(!calculated)
                    getDimens();
            }
        };
        mGrid.setVerticalSpacing(0);
        mGrid.setHorizontalSpacing(0);
        mGrid.setStretchMode(GridView.NO_STRETCH);
        mGrid.setBackgroundColor(Color.rgb(100, 10, 10));
        ((RelativeLayout)findViewById(R.id.rootview)).addView(mGrid, params);
    }

    private int mCellWidth;
    private int mCellHeight;
    boolean calculated = false;
    protected void getDimens() {
        calculated = true;
        //here you might have some rounding errors
        //thats why you see some padding around the GridView
        mCellWidth = mGrid.getWidth()/numberOfColumns;
        mCellHeight = mGrid.getHeight()/numberOfRows;
        mGrid.setColumnWidth(mCellWidth);
        mGrid.setNumColumns(numberOfColumns);
        mAdapter = new ArrayAdapter<String>(this, R.layout.item_grid, R.id.text, items) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                GridView.LayoutParams params = null;
                if(convertView == null) {
                    params = new GridView.LayoutParams(mCellWidth, mCellHeight);
                }
                convertView = super.getView(position, convertView, parent);
                if(params != null) {
                    convertView.setLayoutParams(params);
                }
                return convertView;
            }
        };
        mGrid.setAdapter(mAdapter);
    }
}

コメントmCellWidth: 、、、およびmCellHeightを選択する適切なアルゴリズムを見つけたほうがよいでしょう。numberOfColumnsnumberOfRows

于 2012-12-12T08:40:35.583 に答える
2

グリッドビューに高さと幅を指定する場合は、グリッドビューの外側に相対レイアウトを配置し、相対レイアウトに android:layout_width と android:layout_height を指定します。次に、グリッドビューの幅と高さを match_parent に指定します。その後、最初に gridview セル要素に正確な高さと幅を指定する場合は、すべてのセルの正確な幅と高さを知る必要があり、それに従って columnWidth を定義する必要があります。たとえば、このコードの場合

 <GridView
android:id="@+id/calendar"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@+id/rl1"
android:layout_below="@+id/ll2"
android:columnWidth="250dp"
android:numColumns="7" >
</GridView>

外部に1000dpのレイアウトがない場合、1行に4つのセルが表示されることはありませんが、グリッドビューのみが独自のセル幅を決定しようとします。

あなたの状況では、カレンダーのグリッドビューは次のようになります。

<GridView
android:id="@+id/calendar"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_above="@+id/rl1"
android:layout_below="@+id/ll2"
android:columnWidth="50dp"
android:numColumns="7" >
</GridView>
于 2012-12-07T18:42:48.337 に答える
1

の XML で次の 2 つの値を設定してみてくださいGridView

android:horizontalSpacing="0dp"
android:verticalSpacing="0dp"

android:columnWidthおそらく、フィールドを削除したいと思うでしょう。

于 2012-12-07T17:47:30.433 に答える