向きと画面サイズに応じて、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;
}
}
}
}
}
コードの何が問題になっていますか?