2

向きと画面サイズに応じて、1〜3列のGridLayoutがあります。各 GridLayout アイテムは、ImageView などを含む垂直方向の LinearLayout (TextViews を含む LinearLayout など) です。画像にはさまざまなサイズがあります。画像をトリミングするための簡単なアルゴリズムを作成しました。正常に動作する場合もありますが (ゆっくりスクロールする場合など)、結果がまったく表示されない場合もあります。高速スクロール中に項目が消えることがあります。SquareImageView は知っていますが、私の画像は正方形ではなく横長です。すべてのアイテムの画像の高さを 1 行に設定したい。

私の GridView は次のようになります。

 ________________      ________________
|                |    |                |
|                |    |                |
|   ImageView    |    |   ImageView    |
|                | :( |________________|
|________________|   ^| LL, text, etc  |
| LL, text, etc  |^   |________________|
|________________|

setAdapter の後:

//gvStocks is my GridView
gvStocks.setOnScrollListener(new AbsListView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {}

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
        //MainHelper is an abstract class containing methods & code snippets
        MainHelper.adjustImgHeights(gvStocks, firstVisibleItem, visibleItemCount);
    }
});
gvStocks.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        MainHelper.adjustImgHeights(gvStocks);
        if (Build.VERSION.SDK_INT >= 16)
            gvStocks.getViewTreeObserver().removeOnGlobalLayoutListener(this);
    }
});

MainHelper.adjustImgHeights:

public static void adjustImgHeights(GridView gvStocks) {
    int first = gvStocks.getFirstVisiblePosition();
    adjustImgHeights(gvStocks, first, gvStocks.getLastVisiblePosition() - first + 1);
}

public static void adjustImgHeights(GridView gvStocks, int firstVisibleItem, int visibleItemCount) {
    int cols = gvStocks.getNumColumns();
    for (int curPos = firstVisibleItem; curPos < firstVisibleItem + visibleItemCount; curPos++) {
        int first = (curPos + 1) - (curPos) % cols - 1;
        int minHeight = Integer.MAX_VALUE;

        //get min height
        for (byte b = 0; b < cols; b++) {
            ViewGroup item = (ViewGroup) gvStocks.getChildAt(first + b);
            if (item != null) {
                ImageView iv = (ImageView) item.findViewById(R.id.ivStock);
                int height = iv.getHeight();
                if (height != 0) {
                    if (height < minHeight)
                        minHeight = height;
                }
            }
        }
        if (minHeight != Integer.MAX_VALUE) {
            //set min height
            for (byte b = 0; b < cols; b++) {
                ViewGroup item = (ViewGroup) gvStocks.getChildAt(first + b);
                if (item != null) {
                    ImageView iv = (ImageView) item.findViewById(R.id.ivStock);
                    iv.getLayoutParams().height = minHeight;
                }
            }
        }
    }
}

コードの何が問題になっていますか?

4

0 に答える 0