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:
- Controllare RecyclerView adattatore orientamento, e solo fare questo parent.getHeight(), ecc, in rapporto alle dimensioni lungo cui è consentito lo scorrimento.
- 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.
@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