2016-03-09 16 views
9

Ho un problema con il mio RecyclerView e gli elementi figlio. Non si estendono attraverso l'intero android:layout_width="match_parent"fill_parent. Ho provato entrambi. Il fatto è che questo lavoro perfettamente e senza modifiche è stato rovinato in qualche modo.Elemento in RecyclerView che non riempie la sua larghezza match_parent

sto mostrando questo in un FragmentDialog e gli elementi figlio espandere solo come wrap_content quando ho scorrere la vista su e giù, sono completamente sviluppati, ma non appena clicco su di loro (che io chiamo notifyDataSetChanged()) si restringono di nuovo.

Ecco un'immagine di un elemento riempito correttamente e sotto è come sono quando caricano o quando notificaData. Anche il StickHeaderAdapter che uso, non mostra le intestazioni finché non faccio clic su uno degli elementi (questo funziona in precedenza e non ho modificato nulla su quella parte).

recyclerview child problem

ecco il codice per la riga bambino:

<?xml version="1.0" encoding="utf-8"?> 
<carbon.widget.LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    app:carbon_rippleColor="@color/green" 
    app:carbon_rippleStyle="background"> 

<carbon.widget.TextView 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:id="@+id/block_name" 
    android:padding="@dimen/block_row_padding" 
    android:layout_weight="1" 
    android:textSize="@dimen/block_row_text_size" 
    android:textColor="@color/black" 
    app:carbon_rippleColor="@color/green" 
    app:carbon_rippleStyle="background"/> 

<RelativeLayout 
    android:id="@+id/download_layout" 
    android:layout_width="64dp" 
    android:layout_height="match_parent" 
    android:layout_marginRight="24dp" 
    android:layout_marginEnd="24dp" 
    android:visibility="gone"> 


    <carbon.widget.ProgressBar 
     android:id="@+id/downloading_bar" 
     app:carbon_progressStyle="circular_indeterminate" 
     app:carbon_barWidth="5dp" 
     app:carbon_tint="@color/green" 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     android:layout_gravity="center" 
     android:layout_margin="8dp" 
     android:visibility="invisible"/> 

    <carbon.widget.TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/block_progress_download" 
     android:textSize="12sp" 
     android:layout_centerVertical="true" 
     android:layout_centerHorizontal="true" 
     android:visibility="invisible" /> 

</RelativeLayout> 

E qui è la parte del codice dell'adattatore in cui creo ViewHolder:

@Override 
public BlockAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.block_row, parent, false); 
    return new ViewHolder(view); 
} 

Questo è il codice vincolante se aiuta:

@Override 
public void onBindViewHolder(BlockAdapter.ViewHolder holder, int position) { 
    if (blockData.isDownloading()) { 
     holder.download_layout.setVisibility(View.VISIBLE); 
     holder.download_bar.setVisibility(View.VISIBLE); 
     if (blockData.getProgress() != null) { 
      holder.download_progress.setVisibility(View.VISIBLE); 
      holder.download_progress.setText(String.format("%d%%", blockData.getProgress())); 
     } 
    } else { 
     holder.download_layout.setVisibility(View.GONE); 
     holder.download_bar.setVisibility(View.GONE); 
     holder.download_progress.setVisibility(View.GONE); 
    } 

    if (selected) { 
     holder.itemView.setBackgroundColor(mContext.getResources().getColor(R.color.green)); 
     holder.block_name.setTextColor(mContext.getResources().getColor(R.color.white)); 
    } else { 
     holder.itemView.setBackgroundColor(mContext.getResources().getColor(R.color.white)); 
     holder.block_name.setTextColor(mContext.getResources().getColor(R.color.black)); 
    } 

} 

Non so il motivo per cui questo lavoro la mattina e modificata successivamente ...

cose che ho provato:

  • Change match_parent per fill_parent
  • Impostare RecyclerView.LayoutParams a LayoutParams.MATCH_PARENT
  • Cambia larghezza in modo programmatico
  • Variazione createViewHolder ..., parent, false);-..., null); e aggiungere Parametri seperatelly
  • connessi alla larghezza (a volte è come 390, quando ho scorrere si arriva a 990 e quando clicco di nuovo a 390)
  • Setup StickHeaders prima, ma sono tutti impostati quando vengono creati e l'intestazione è lì, è solo invisibile.

QUALSIASI AIUTO È APPREZZATO!

+1

Hai provato utilizzando un normale * * 'LinearLayout'? Non ho idea di cosa sia 'carbon.widget.LinearLayout' o cosa fa –

+0

Semplicemente aggiunge l'effetto a catena per fare clic sugli elementi. Ha funzionato con quello prima:/ – slorangex

+0

Beh, fa qualche misura personalizzata, quindi non mi fiderei completamente di quello. Dovresti provare se funziona con un layout normale. –

risposta

35

Il problema si trova nella nuova libreria di supporto 23.2.0, quindi l'ho ripristinato a 23.1.1 e funziona correttamente. Se trovo una soluzione, o cosa cambierò, ti farò sapere, altrimenti lascerò questa discussione aperta, se qualcun altro trova una risposta migliore.

UPDATE

Ok, così ho deciso che era il momento di risolvere il problema, come abbiamo bisogno di passare a nuove librerie di supporto e alla fine ho trovato una risposta.

Il problema era/è che il nuovo LayoutManager sta usando autoMeasure() e in qualche modo ha cambiato tutta la mia match_parent-wrap_content, ecco cosa dovete fare, se si verifica un problema simile.

Innanzitutto creare LinearLayoutManager llm = new LinearLayoutManager(getActivity());

poi llm.setAutoMeasureEnabled(false);

e, infine, si imposta la LinearLayoutManager al RecyclerView, ma fare questo DOPOrecyclerView.setAdapter(yourAdapter);

Ecco un rapido esempio:

recyclerView.setAdapter(adapter); 
recyclerView.setHasFixedSize(true); 
LinearLayoutManager llm = new LinearLayoutManager(getActivity()); 
llm.setAutoMeasureEnabled(false); 
recyclerView.setLayoutManager(llm); 
+0

Trovo un po 'ridicolo che questi bug di ordinamento '.setLayoutManager()' e '.setAdapter()' –

+1

Questo ha funzionato per me grazie. Sto usando RecyclerView 25.2.0 e ho impostato prima il gestore di layout, poi setAutoMeasureEnabled (false) e poi l'adattatore che ha funzionato –

+0

grazie. per me funziona. –

0

Per walkaround questo errore ho cambiato:

recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()); 

con:

recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 1)); 
Problemi correlati