Процентная ширина экрана Android в элементе RecyclerView - PullRequest
0 голосов
/ 06 июля 2018

Как бы я мог получить высоту элемента RecyclerView, скажем, 30% от высоты экрана?

Я не могу просто использовать ConstraintLayout или PercentFrameLayout / PercentRelativeLayout, поскольку эти дочерние макеты позиционируются относительно родительских макетов, размер которых может не соответствовать экранам.

Желательно, чтобы я делал это в чистом XML (и не использовал бы Runnables для динамического получения высоты экрана).

EDIT

Для пояснения, поскольку многие решения предлагают ограничить высоту RecyclerView, это не является целью. RecyclerView должен по-прежнему заполнять экран. Вот о чем я говорю, используя ширину экрана (вместо высоты):

enter image description here

Идея состоит в том, чтобы получить ширину карты, равную 33% ширины экрана , сохраняя при этом ширину RecyclerView без изменений при прокрутке экрана горизонтально.

Ответы [ 5 ]

0 голосов
/ 17 июля 2018

Ну, я просто попытался решить проблему, с которой вы столкнулись. Я играл с несколькими вещами. Шаги следующим образом:

  1. MainActivity View, где RecyclerView имеет высоту ровно 30% экрана. enter image description here
  2. Recycler View Items Высота и ширина должны быть match_parent. enter image description here

Что там происходит?

  1. recyclerHolder имеет ровно 30% высоты экрана, нет никаких сомнений.

  2. Внутри recyclerHolder у нас есть RecyclerView, который принимает все эти 30% высоты родительского элемента и принимает полную ширину.

  3. ListItem Layout принимает полную высоту и ширину родительского элемента, где родительский элемент равен RecyclerView, который имеет ровно 30% высоты экрана.

Я попробовал это и работает отлично. Там вы можете найти 2 пустых представления, просто чтобы проверить, идеально ли они подходят сверху и снизу, результат да, это так. поместите в элемент списка все, что займет 30% высоты экрана.

0 голосов
/ 16 июля 2018

Вы можете использовать Показать метрики

Определение отображаемых метрик в конструкторе или использование любого другого статического метода инициализации.

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

Теперь вы можете использовать его в onCreateViewHolder ()

View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);

//setting the height programmatically
itemView.getLayoutParams().height = metrics.heightPixels/3;
itemView.requestLayout();

Или Вы можете использовать в onBindViewHolder () для родительского макета.

0 голосов
/ 07 июля 2018

Вы можете переопределить один из LayoutManager методов, используемых вашим RecyclerView для принудительного задания определенного размера:

recyclerView.setLayoutManager(new LinearLayoutManager(this){
    @Override
    public boolean checkLayoutParams(RecyclerView.LayoutParams lp) {
        // force height of viewHolder here, this will override layout_height from xml
        lp.height = getHeight() / 3;
        return true;
    }
});

Это предполагает, что ваш RecyclerView помещается на экран.

0 голосов
/ 13 июля 2018

Вы не можете установить процентную высоту элемента только по XML. Причина в том, что это предмет, который будет раздут во время выполнения, это не раскладка. Который вы пишете в своем XML.

Итак, теперь я расскажу вам о двух способах достижения процента / веса

Первый предпочтительный способ - переопределить высоту в методе onCreateViewHolder() внутри вашего Adapter

private int height = 0; // declared height globally in Adapter class to reuse it.

@Override
public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
    if (height == 0)
        height = (int) (parent.getMeasuredHeight() * .3);
    itemView.setMinimumHeight(height);
    return new ItemViewHolder(itemView);
}

2nd Hack - это для использования библиотеки SDP .

Использовать высоту элемента в XML в sdp скажем _160sdp. Это не даст вам точных результатов 30%. Но он может настроить в соответствии с экраном.

0 голосов
/ 06 июля 2018

Нет способа сделать это в XML, о котором я знаю. Однако вы можете сделать это в Java (без каких-либо Runnable s и т. Д.), Установив ViewHolder LayoutParams *1002* перед возвратом ViewHolder в методе onCreateViewHolder() вашего адаптера:

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

    ViewGroup.LayoutParams layoutParams = itemView.getLayoutParams();
    layoutParams.height = (int) (parent.getHeight() * 0.3);
    itemView.setLayoutParams(layoutParams);

    return new MyViewHolder(itemView);
}
...