Как программно установить ширину и высоту элемента ячейки в GridView в Android

Я пытаюсь установить динамическую ширину и высоту элементов 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 столбца, но ячейки растягиваются по ширине - высота выглядит нормально - как показано здесь:

Как программно установить ширину и высоту элемента ячейки в GridView в Android

Есть ли способ отредактировать мой код и сделать размер ячеек правильным, как квадратные изображения, 3 столбца, в зависимости от размера устройства?

1
0
1 564
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуй это

 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"/>

Я сделал, к сожалению, вот что я получаю: s6.postimg.cc/4j5t52v1t/Screenshot_2018-07-11-11-07-08.png - я удалил код ниже // Установите количество столбцов в соответствии с используемым устройством

Frank Eno 11.07.2018 11:10

PS: Я отредактировал ваш ответ, вот как я исправил проблему, в любом случае большое спасибо за ваш ответ!

Frank Eno 11.07.2018 11:16

Другие вопросы по теме