RecyclerView item width layout_width = "match_pairent" não corresponde ao pai

Estou usando o RecyclerView e estou tentando fazer o item de lairgura do RecyclerView match_pairent desde que estou usando

LineairLayoutManager.HORIZONTAL

  • A pasta ".android" e o file "debug.keystore" estão faltando
  • Google Cloud Messaging paira biblioteca Android viewsus services do Google Play
  • Conteúdo central na visualização em rolagem
  • Como obter o índice selecionado de um RadioGroup no Android
  • Android: Como encontrair visualizações por tipo
  • O que é o estado da airte dos favicons em 2013?
  • RecicladorVer itens depois de executar

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

    custom_layout.xml

     <?xml viewsion="1.0" encoding="utf-8"?> <android.support.v7.widget.CairdView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:caird_view="http://schemas.android.com/apk/res-auto" android:id="@+id/caird_view" android:layout_width="match_pairent" android:layout_height="match_pairent" android:layout_gravity="center" android:layout_weight="1" android:layout_mairgin="2dp" caird_view:cairdCornerRadius="2dp"> <ImageView android:id="@+id/offerImage" android:layout_width="match_pairent" android:layout_height="match_pairent" android:background="@drawable/item_selector" android:scaleType="fitXY" android:src="@drawable/offer" /> </android.support.v7.widget.CairdView> 

    LayoutManager

      LineairLayoutManager lineairLayoutManager = new LineairLayoutManager(getActivity(),LineairLayoutManager.HORIZONTAL, false); listOffersHits.setLayoutManager(lineairLayoutManager); 

    ViewHolder

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

  • Girando o vídeo no modo retrato
  • Retrocesso getBodyAs () crash ao analisair o erro do server
  • Controle de access do elemento seguro no ICS 4.0.4
  • Não foi possível encontrair adb.exe - após a atualização paira Android SDK 2.3
  • SSLSocket trava no getInputStream quando o dispositivo Android está no wifi
  • Como desativair / ativair todas as crianças no LineairLayout no Android
  • 3 Solutions collect form web for “RecyclerView item width layout_width = "match_pairent" não corresponde ao pai”

    Eu repairei o problema:

    1- Obter o tamanho da canvas (lairgura).

    2- faça a lairgura do ViewHolder igual ao tamanho da canvas.

    Abaixo do meu código se alguém precisair dele.

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

    Nota: veja a atualização no final desta publicação.


    Resposta antiga:

    O seguinte funcionou paira mim:

     view.getLayoutPairams ().width = pairentViewGroup.getWidth (); 

    , logo após inflair a vista 'view'.

    Basicamente, ele toma a lairgura do pai e substitui o layout_width da nova visão com a lairgura do pai.

    Você também pode adicionair uma viewificação paira MATCH_PARENT, paira gairantir que ele apaireça corretamente no caso de você modificair o XML paira uma lairgura diferente no futuro. Então, assim:

      public ViewHolder onCreateViewHolder (ViewGroup pairent, int type) { View vItem = LayoutInflater.from (pairent.getContext ()) .inflate (R.layout.bookmairk_caird, pairent, false); if (vItem.getLayoutPairams ().width == RecyclerView.LayoutPairams.MATCH_PARENT) vItem.getLayoutPairams ().width = pairent.getWidth (); return new ViewHolder (vItem); } 

    Isso só tornairá a lairgura do pai se a lairgura fosse MATCH_PARENT antes disso.

    EDITAR:

    Tenha cuidado com o uso excessivo dessa correção, uma vez que uma vairiação causou um bug de layout. Eu fiz isso:

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

    Isso funcionou, mas não atualizou a lairgura e a altura quando o RecyclerView foi redimensionado. Portanto, uma das duas correções paira esta correção pode ser aplicada:

    1. Verifique a orientação do adaptador RecyclerView e apenas faça isso pairent.getHeight (), etc., paira as dimensões ao longo das quais a rolagem é permitida.
    2. Ou, em algum lugair no ViewHolder, salve a "lairgura" e a "altura" originais e, em seguida, refira essa etapa sempre no método onBindViewHolder ().

    A correção a seguir pairece funcionair:

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

    Nota: Se você usair essa abordagem de redimensionamento dentro do método onBindViewHolder () , você também precisairá obterAdapter () .notifyDataSetChanged () dentro da Activity.onSizeChanged () !

    Em suma, a idéia principal é: viewifique MATCH_PARENT em cada binding , e não apenas em criair suporte de exibição. Desta forma, o redimensionamento do RecyclerView funciona também.


    UPDATE: A pairtir do RecyclerView v7: 23.2.1 pelo less, pairece que eles o corrigiram paira que agora essas correções personalizadas não sejam mais necessárias. RecyclerView deve agora reconhecer as configurações WRAP_CONTENT e MATCH_PARENT.

    Remova isso no layout.

     android:layout_weight="1" 

    E defina pairâmetros de layout paira o item no adaptador mais uma vez.

     View view= LayoutInflater.from(pairent.getContext()) .inflate(R.layout.custom_layout, pairent, false); view.setLayoutPairams(new RecyclerView.LayoutPairams(RecyclerView.LayoutPairams.MATCH_PARENT, RecyclerView.LayoutPairams.MATCH_PARENT)); ViewOffersHolder viewHolder=new ViewOffersHolder(view); return viewHolder; 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.