画像のグリッドを表示しようとしています (実行時にそれらがいくつになるかを知っています)。私の問題は、このグリッドが垂直 ScrollView 内と ViewPager 内にある必要があるため、2 つのスクロール可能なビューを別のビュー内に配置することはお勧めできません。すでに咳き込んでいます。
したがって、TableLayoutを使用してこれを達成し、数学を使用してすべてのパディング/マージン/寸法を手動で設定しようとしています。私が得ているのはこれです:
これらの結果を達成するために私にできることはありますか?
おそらく、高さと幅が固定された GridLayout を使用しています。
TableLayout に入力するためにこれまでに作成したコードを以下に示します。これは Fragment 内にあり、「act」はアクティビティへの参照、table_view は私の TableLayout、objectids は使用する画像の ID を含む LinkedList です。
private void calculateGrid() {
table_view.removeAllViews();
table_view.setVisibility(View.VISIBLE);
int minLato = Math.min(act.metrics.widthPixels, act.metrics.heightPixels);
float density = act.metrics.density;
int screenX = (int) (minLato / act.metrics.density);
float factor = 4f;
int imageXpx = (int) (minLato / factor);
int imageX = (int) (imageXpx / act.metrics.density);
int margins;
int numImage = objectids == null ? 0 : objectids.size();
int numRow;
int numCol;
int gridY; // = ?
int countImg = 1;
if (screenX % imageX == 0) { // TODO poi sarà un po piu di 0 per non avere margini minuscoli
numCol = screenX / imageX - 1;
margins = imageX / (screenX / imageX);
} else {
numCol = screenX / imageX;
margins = (screenX % imageX) / (screenX / imageX + 1);
}
margins = Math.min(10, margins);
int dpMargins = (int) (margins * density);
numRow = (int) Math.ceil(numImage / (double) numCol);
gridY = numRow * (margins * 2 + imageX);
Log.e(TAG, "dens: " + density + " screen: " + screenX + " img: " + imageX + " margins: " + margins + " numImg: " + numImage + " numRow: " + numRow
+ " numCol" + numCol + " gridY: " + gridY);
List<TableRow> rows = new LinkedList<TableRow>();
int ID = 1000;
TableRow oneRow;
TableLayout.LayoutParams tableParams = new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.WRAP_CONTENT);
tableParams.gravity = Gravity.CENTER;
for (int i = 1; i <= numRow; i++) {
Log.d(TAG, "row " + i);
oneRow = new TableRow(ctx);
oneRow.setLayoutParams(tableParams);
for (int k = 1; k <= numCol; k++) {
Log.d(TAG, "col " + k);
if (countImg <= numImage) {
Log.i(TAG, "img " + countImg);
ImageView img = new ImageView(ctx);
TableRow.LayoutParams rp = new TableRow.LayoutParams(imageXpx, imageXpx);
rp.bottomMargin = dpMargins;
rp.topMargin = dpMargins;
rp.leftMargin = dpMargins;
rp.rightMargin = dpMargins;
img.setLayoutParams(rp);
img.setId(ID + countImg);
img.setScaleType(ImageView.ScaleType.CENTER_CROP);
loadBitmaps(ctx, app.getDatabase(), img, objectids.get(countImg - 1), "image", target_graphid, ticket);
img.setImageResource(R.drawable.capiicona);
oneRow.addView(img);
countImg++;
}
}
rows.add(oneRow);
}
for (TableRow tr : rows)
table_view.addView(tr);
table_view.setGravity(Gravity.CENTER_HORIZONTAL)
}
貴重なご協力ありがとうございます。