Intereting Posts
Xamarin Android – создание запроса на отдых со сложным параметром (объектом) вызывает исключение, в .NET он отлично работает (с использованием фабрики каналов) Как найти идентификатор приложения Google Play? Переопределение аппаратных кнопок на Android Получить информацию о значении браузера android и отобразить его на экране Как использовать метод finish () в android Не удалось найти местоположение Android SDK для настройки предпочтения Eclipse KitKat занимает 6 секунд больше, чем Froyo, чтобы реагировать на TextToSpeech.speak () при первом вызове Android, как защитить содержимое в каталоге документов DatePicker вызывает исключение при рендеринге в LayoutEditor Исключая устройства ARMv5 и ARMv6 из Google Play Android MediaPlayer.getCurrentPosition () возвращает неверные значения Требовать пароль перед отключением приложения как администратора в Android Пробел изображения появляется даже после Ellipsize в текстовом элементе Android Как получить ширину и высоту экрана Утилиты Google Maps Utilities IconGenerator – текстовые стили и фон

RecyclerView ширина элемента layout_width = "match_parent" не совпадает с родительским

Я использую RecyclerView, и я пытаюсь сделать элемент width из RecyclerView match_parent, так как я использую

LinearLayoutManager.HORIZONTAL

Элементы RecyclerView после запуска

<android.support.v7.widget.RecyclerView android:id="@+id/listOffersHits" android:layout_width="match_parent" android:layout_height="match_parent" /> 

custom_layout.xml

 <?xml version="1.0" encoding="utf-8"?> <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:card_view="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:layout_weight="1" android:layout_margin="2dp" card_view:cardCornerRadius="2dp"> <ImageView android:id="@+id/offerImage" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/item_selector" android:scaleType="fitXY" android:src="@drawable/offer" /> </android.support.v7.widget.CardView> 

LayoutManager

  LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity(),LinearLayoutManager.HORIZONTAL, false); listOffersHits.setLayoutManager(linearLayoutManager); 

ViewHolder

 View view= LayoutInflater.from(parent.getContext()) .inflate(R.layout.custom_layout, parent, false); ViewOffersHolder viewHolder=new ViewOffersHolder(view); return viewHolder; 

Я исправил проблему:

1- Получить размер экрана (ширина).

2- сделайте ширину ViewHolder равной размеру экрана.

Под моим кодом, если кому-то это нужно.

 WindowManager windowManager = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); int width = windowManager.getDefaultDisplay().getWidth(); int height = windowManager.getDefaultDisplay().getHeight(); view.setLayoutParams(new RecyclerView.LayoutParams(width, RecyclerView.LayoutParams.MATCH_PARENT)); 

Примечание. См. Обновление в самом конце этого сообщения.


Старый ответ:

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

 view.getLayoutParams ().width = parentViewGroup.getWidth (); 

, Сразу после раздувания представления «вид».

Он в основном принимает ширину родительского элемента и заменяет layout_width нового вида на ширину родителя.

Вы также можете добавить проверку для MATCH_PARENT, чтобы убедиться, что она отображается правильно, если вы измените XML на другую ширину в будущем. Ну вот так:

  public ViewHolder onCreateViewHolder (ViewGroup parent, int type) { View vItem = LayoutInflater.from (parent.getContext ()) .inflate (R.layout.bookmark_card, parent, false); if (vItem.getLayoutParams ().width == RecyclerView.LayoutParams.MATCH_PARENT) vItem.getLayoutParams ().width = parent.getWidth (); return new ViewHolder (vItem); } 

Это сделает только ширину родителя, если перед этим была ширина MATCH_PARENT.

РЕДАКТИРОВАТЬ:

Будьте осторожны с чрезмерным использованием этого исправления, поскольку его изменение вызвало ошибку макета. Я сделал это:

  public ViewHolder onCreateViewHolder (ViewGroup parent, int type) { View vItem = LayoutInflater.from (parent.getContext ()) .inflate (R.layout.page_tile, parent, false); if (vItem.getLayoutParams ().width == RecyclerView.LayoutParams.MATCH_PARENT) vItem.getLayoutParams ().width = parent.getWidth (); if (vItem.getLayoutParams ().height == RecyclerView.LayoutParams.MATCH_PARENT) vItem.getLayoutParams ().height = parent.getHeight (); return new ViewHolder (vItem); } 

Это сработало, но при изменении размера RecyclerView он не обновлял ширину и высоту. Поэтому одно из двух исправлений для этого исправления может быть применено:

  1. Проверьте ориентацию адаптера RecyclerView и создайте этот parent.getHeight () и т. Д. Для размеров, по которым разрешена прокрутка.
  2. Или, где-то в ViewHolder, сохраните исходную «ширину» и «высоту», а затем повторите этот шаг каждый раз в методе onBindViewHolder ().

Кажется, что следующее исправление работает:

  public ViewHolder onCreateViewHolder (ViewGroup parent, int type) { View vItem = LayoutInflater.from (parent.getContext ()) .inflate (R.layout.page_tile, parent, false); ViewHolder holder = new ViewHolder (vItem); // Create view holder. holder.vItem = vItem; // Save top-level View. holder.vParent = parent; // Save its parent. ViewGroup.LayoutParams lp = vItem.getLayoutParams (); if (lp != null) { // Save the original width and height from lp: holder.originalWidth = lp.width; holder.originalHeight = lp.height; refreshLayoutParams (holder); // Check for MATCH_PARENT. } else holder.originalHeight = holder.originalWidth = 0; return holder; } public void onBindViewHolder (ViewHolder holder, int position) { ... do work here ... refreshLayoutParams (holder); // Check AGAIN for MATCH_PARENT. } private void refreshLayoutParams (ViewHolder holder) { ViewGroup.LayoutParams lp = holder.vItem.getLayoutParams (); View parent = holder.vParent; if (parent == null) return; // Is there a parent to check against? if (lp == null) holder.vItem.setLayoutParams (lp = new RecyclerView.LayoutParams (holder.originalWidth, holder.originalHeight)); if (holder.originalWidth == RecyclerView.LayoutParams.MATCH_PARENT) lp.width = parent.getWidth (); // Check width. if (holder.originalHeight == RecyclerView.LayoutParams.MATCH_PARENT) lp.height = parent.getHeight (); // Check height. } 

Примечание. Если вы используете такой подход для изменения размера внутри метода onBindViewHolder () , вам также потребуется getAdapter () .notifyDataSetChanged () внутри Activity.onSizeChanged () !

Короче говоря, основная идея: проверить MATCH_PARENT на каждое связывание , а не только на создание владельца представления. Таким образом, изменение размера RecyclerView тоже работает.


ОБНОВЛЕНИЕ: По крайней мере, по мнению RecyclerView v7: 23.2.1, похоже, они исправили его, так что теперь эти пользовательские исправления больше не нужны. Теперь RecyclerView должен распознавать настройки WRAP_CONTENT и MATCH_PARENT.

Удалите это в макете.

 android:layout_weight="1" 

И еще раз установите параметры макета для элемента в адаптере.

 View view= LayoutInflater.from(parent.getContext()) .inflate(R.layout.custom_layout, parent, false); view.setLayoutParams(new RecyclerView.LayoutParams(RecyclerView.LayoutParams.MATCH_PARENT, RecyclerView.LayoutParams.MATCH_PARENT)); ViewOffersHolder viewHolder=new ViewOffersHolder(view); return viewHolder;