Как установить высоту строки элемента в GridLayoutManager

Текущий вид

Мой элемент Recycler, который надувается в onCreateViewHolder

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="16dp">

    <ImageView
        android:id="@+id/gridListImageView"
        android:layout_width="96dp"
        android:layout_height="96dp"
        android:src="@drawable/a" />

    <TextView
        android:id="@+id/gridListView_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>

Я хочу показать что-то вроде этого Что имеет один ряд из половины высоты просмотра Recycler? И добавить отступы для остальной части пространства? Могу ли я сделать это с помощью GridLayoutManager?

И это мой GridLayoutManager

        GridLayoutManager glm = new GridLayoutManager(getActivity(), 2);
        recyclerView.setLayoutManager(glm);

Ответ 1

При раздувании макета для ваших видов в адаптере вы можете установить их высоту программно. Чтобы оценить правильную высоту использования, вы можете полагаться на родительскую ViewGroup (то есть на RecyclerView). Вот пример:

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = mLayoutInflater.inflate(R.layout.view_item, parent, false);
    // work here if you need to control height of your items
    // keep in mind that parent is RecyclerView in this case
    int height = parent.getMeasuredHeight() / 4;
    itemView.setMinimumHeight(height);
    return new ItemViewHolder(itemView);        
}

Надеюсь, это поможет.

Ответ 2

когда-нибудь, получив размер зрения надувания в возврате адаптера 0 или отрицательный. другой подход - получить требуемый размер со стороны адаптера, манипулировать им и установить его в поле зрения. в моем случае, еще одна проблема была безразлична. поэтому я устанавливаю размер с помощью параметра layout

здесь устанавливается мой адаптер в действии:

Display display = MainActivity.this.getWindowManager().getDefaultDisplay();
                    Point size = new Point();
                    display.getSize(size);
                    int  y = size.y;
                    y=(int)y/2;
 GridLayoutManager linearLayoutManager = new GridLayoutManager(MainActivity.this,2);
                    recyclerView.setLayoutManager(linearLayoutManager);
                    NewOrderAdapter newOrderAdapter=new NewOrderAdapter(MainActivity.this,arrayListname,arrayListimage,y);
                    recyclerView.setAdapter(newOrderAdapter);

и я установил размер вида следующим образом:

@Override
    public myviewholder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = inflator.inflate(R.layout.new_order_row, viewGroup, false);
        GridLayoutManager.LayoutParams params = (GridLayoutManager.LayoutParams) view.getLayoutParams();
        params.height = ysize;
        view.setLayoutParams(params);
        myviewholder holder = new myviewholder(view);
        return holder;
    }

и не забудьте установить высоту для макета в вашем макете для инициализации

Ответ 3

Как и в библиотеке поддержки 25.1.0, ответ thetonrifles не работает. Я предлагаю следующие модификации:

    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
        GridLayoutManager.LayoutParams lp = (GridLayoutManager.LayoutParams) v.getLayoutParams();
        lp.height = parent.getMeasuredHeight() / 4;
        v.setLayoutParams(lp);
        return new ViewHolder(v);
    }

Ответ 4

Это мой код для регулировки высоты элемента просмотра переработанного цикла на основе реального аспекта.

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.adapter_offers, parent, false);

    int width =  parent.getMeasuredWidth();
    float height = (float) width / Config.ASPECT_RATIO;//(Width/Height)
    RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) itemView.getLayoutParams();
    params.height = Math.round(height);
    itemView.setLayoutParams(params);
    return new MyViewHolder(itemView);
}

Ответ 5

На недавнем уровне API в настоящее время 25 высота от ресайклера в onCreateViewHolder всегда пусто. Этот фрагмент должен установить высоту после просмотра ресайклером onMeasure вызывается и устанавливает правильную высоту в виде раздутого списка.

@Override
public DataBindingViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
    // You may inflate your view here.
    parent.post(new Runnable() {

        @Override
        public void run() {
            int height = parent.getMeasuredHeight() / rows;
            View view = holder.getBinding().getRoot();
            view.getLayoutParams().height = height;
        }
    });
    return holder;
}

Ответ 6

Вам не нужно устанавливать высоту элемента. Проблема в том, что изображение пытается заполнить все пространство. Просто добавь android:adjustViewBounds="true" в ваш ImageView и не будет добавлять пробелы