2015-08-25 16 views
7

sto usando RecyclerView e sto cercando di fare l'articolo larghezza RecyclerView match_parent dal momento che sto usandoRecyclerView larghezza voce layout_width = “match_parent” non corrisponde genitore

LinearLayoutManager.HORIZONTAL

RecyclerView items after running

<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; 
+0

@Rami grazie per il tuo commento, ho provato entrambe le soluzioni suggerite ma è sempre la stessa. E non penso che il problema dal CardView perché l'ho cambiato in "FrameLayout" e ancora lo stesso. – Diyaa

risposta

12

ho risolto il problema:

1- ottenere la dimensione dello schermo (larghezza).

2- rendere larghezza ViewHolder uguale alla dimensione dello schermo.

Sotto il mio codice se qualcuno ne ha bisogno.

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)); 
+1

Funziona, ma le immagini sono fuori forma ... –

3

Rimuovere questo nel layout.

android:layout_weight="1" 

E impostare nuovamente i parametri di layout per l'articolo nell'adattatore.

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; 
+1

L'ho fatto ma nessun cambiamento. – Diyaa

6

Nota: See aggiornamento alla fine di questo post.


Old Risposta:

Di seguito ha lavorato per me:

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

, subito dopo il gonfiaggio la vista 'view'.

Prende sostanzialmente la larghezza del genitore e sostituisce il layout_width della nuova vista con la larghezza del genitore.

È inoltre possibile aggiungere un controllo per MATCH_PARENT, per assicurarsi che venga visualizzato correttamente nel caso in cui si modifichi l'XML in una larghezza diversa in futuro. Quindi:

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); 
    } 

Lo renderà solo la larghezza genitore se la larghezza era MATCH_PARENT prima di questo.

EDIT:

fatevi attenti a un uso eccessivo di questa correzione, come variazione di esso mi ha causato un errore di layout.Ho fatto questo:

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); 
    } 

Che ha funzionato, ma non ha aggiornato la larghezza e l'altezza quando è stato ridimensionato il RecyclerView. Pertanto, può essere applicato uno dei due correzioni a questa correzione:

  1. Controllare RecyclerView adattatore orientamento, e solo fare questo parent.getHeight(), ecc, in rapporto alle dimensioni lungo cui è consentito lo scorrimento.
  2. Oppure, da qualche parte nel ViewHolder, salva "larghezza" e "altezza" originali, quindi ripeti questo passaggio ogni volta nel metodo onBindViewHolder().

la seguente correzione sembra funzionare:

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. 
    } 

Nota anche: Se si utilizza questo metodo di ridimensionamento all'interno della onBindViewHolder() metodo, dovrà anche getAdapter() .notifyDataSetChanged() all'interno dello Activity.onSizeChanged()!

In breve, l'idea principale è: controlla MATCH_PARENT su ogni bind, non solo su create view holder. In questo modo funziona anche il ridimensionamento di RecyclerView.


UPDATE: Come di RecyclerView v7: 23.2.1 almeno, sembra che hanno fissato in modo che ora queste correzioni personalizzate non sono più necessarie. RecyclerView stesso ora dovrebbe riconoscere sia le impostazioni WRAP_CONTENT che MATCH_PARENT.

+0

Questo ha funzionato bene per me. Tuttavia: invece di utilizzare view.getLayoutParams(). Width = ..., ho fatto view.setLayoutParams (nuovo LinearLayout.LayoutParams (viewGroup.getWidth(), ViewGroup.LayoutParams.WRAP_CONTENT)); anziché. Il motivo è che view.getLayoutParams potrebbe essere nullo (che era nel mio caso per qualche strana ragione). – Igor

+0

@Igor Grazie. Ne ho tenuto conto al momento della modifica sopra. – RhetoricalRuvim

Problemi correlati