Я пытаюсь установить динамическую ширину и высоту элементов GridView, это мой код:
class GridAdapter extends BaseAdapter {
private Context context;
private GridAdapter(Context context, List<ParseObject> objects) {
super();
this.context = context;
}
// CONFIGURE CELL
@Override
public View getView(int position, View cell, ViewGroup parent) {
if (cell == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
cell = inflater.inflate(R.layout.cell_post_search, null);
}
//-----------------------------------------------
// MARK - INITIALIZE VIEWS
//-----------------------------------------------
ImageView postImg = cell.findViewById(R.id.cpsPostImg);
ImageView videoicon = cell.findViewById(R.id.cpsVideoIcon);
...
return cell;
}
@Override public int getCount() { return postsArray.size(); }
@Override public Object getItem(int position) { return postsArray.get(position); }
@Override public long getItemId(int position) { return position; }
}
// Set Adapter
postsGridView.setAdapter(new GridAdapter(ctx, postsArray));
// Set number of Columns accordingly to the device used
float scalefactor = getResources().getDisplayMetrics().density * screenW/3; // LET'S PRETEND MY screenW = 720, this value whoudl, be 240, which is the width i need for my cell
int number = getWindowManager().getDefaultDisplay().getWidth();
int columns = (int) ((float) number / scalefactor);
postsGridView.setNumColumns(columns);
Log.i(Configurations.TAG, "SCALE FACTOR: " + scalefactor);
А вот и мой кастомный cell_post_search.xml:
<?xml version = "1.0" encoding = "utf-8"?>
<RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
android:layout_width = "match_parent"
android:layout_height = "match_parent">
<RelativeLayout
android:id = "@+id/cpsCellLayout"
android:layout_width = "150dp"
android:layout_height = "150dp"
android:layout_alignParentStart = "true"
android:layout_alignParentTop = "true">
<ImageView
android:id = "@+id/cpsPostImg"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:layout_alignParentStart = "true"
android:layout_alignParentTop = "true"
android:background = "#c1c1c1"
android:scaleType = "centerCrop"/>
<ImageView
android:id = "@+id/cpsVideoIcon"
android:layout_width = "44dp"
android:layout_height = "44dp"
android:layout_alignEnd = "@+id/cpsPostImg"
android:layout_alignParentTop = "true"
android:layout_marginRight = "5dp"
android:layout_marginTop = "5dp"
android:visibility = "invisible"
app:srcCompat = "@drawable/play_butt"/>
<ImageView
android:id = "@+id/cpsWhiteFrame"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
app:srcCompat = "@drawable/white_frame"/>
</RelativeLayout>
</RelativeLayout>
Я получаю 480,0 в качестве коэффициента масштабирования в моем Logcat, что мне не подходит (в моем случае это должно быть 240). Во всяком случае, я тоже пытался это сделать:
int columns = (int) ((float) number / (scalefactor/2));
Итак, scalefactor = 240, но это не имеет значения, потому что мне нужно, чтобы элемент моей ячейки был квадратного размера, поэтому в основном: WIDTH = screenWidth / 3, ВЫСОТА = ширина экрана / 3.
Это не работает должным образом, мой GridView показывает 3 столбца, но ячейки растягиваются по ширине - высота выглядит нормально - как показано здесь:
Есть ли способ отредактировать мой код и сделать размер ячеек правильным, как квадратные изображения, 3 столбца, в зависимости от размера устройства?
Попробуй это
class GridAdapter extends BaseAdapter {
private Context context;
private GridAdapter(Context context, List<ParseObject> objects) {
super();
this.context = context;
}
// CONFIGURE CELL
@Override
public View getView(int position, View cell, ViewGroup parent) {
if (cell == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
cell = inflater.inflate(R.layout.cell_post_search, null);
}
//-----------------------------------------------
// MARK - INITIALIZE VIEWS
//-----------------------------------------------
ImageView postImg = cell.findViewById(R.id.cpsPostImg);
ImageView videoicon = cell.findViewById(R.id.cpsVideoIcon);
DisplayMetrics displayMetrics = new DisplayMetrics();
((Activity) mContext).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int width = displayMetrics.widthPixels;
postImg.getLayoutParams().height = width / 3;
...
return cell;
}
@Override public int getCount() { return postsArray.size(); }
@Override public Object getItem(int position) { return postsArray.get(position); }
@Override public long getItemId(int position) { return position; }
}
Также в ваш XML-макет добавьте android:numColumns = "3":
<GridView
android:id = "@+id/upPostsGridView"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:numColumns = "3"/>
PS: Я отредактировал ваш ответ, вот как я исправил проблему, в любом случае большое спасибо за ваш ответ!
Я сделал, к сожалению, вот что я получаю: s6.postimg.cc/4j5t52v1t/Screenshot_2018-07-11-11-07-08.png - я удалил код ниже // Установите количество столбцов в соответствии с используемым устройством