2015-08-02 7 views
15

Attualmente ho bisogno di usare un RecyclerView (o ListView) ma il numero di elementi è fissato a 4. Voglio che quei 4 elementi utilizzino ugualmente lo spazio disponibile sullo schermo. RecyclerView è l'unica vista sullo schermo ad eccezione della barra delle applicazioni. Cioè RecyclerView ha layout_height impostato su match_parent. Ho scelto RecyclerView perché gli articoli hanno layout diversi a seconda dello stato del modello.Come posso usare layout_weight in RecyclerView o ListView per avere elementi di uguale altezza riempire lo spazio disponibile sullo schermo?

Non ho ancora cercato, ma sono sicuro di poter impostare l'altezza a livello di codice in codice Java per ogni articolo. Ma sembra inelegante se posso specificarlo nell'XML. Domande simili alla mia destra, mentre scrivo questo, rispondono a questa domanda.

Ho provato quanto segue nel file item_layout.xml, il modo in cui layout_weight viene utilizzato in altri scenari:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_weight="1" 
    android:layout_height="0dp">...</LinearLayout> 

Ma poi nulla mostra sullo schermo.

Quello che mi piacerebbe sapere è, posso farlo nell'XML layout con layout_weight o qualcos'altro? Se é cosi, come?

+2

se il numero di punti di vista è stato risolto Ti scoraggio completamente a usare listview. basta mettere per layout lineare con peso uguale a uno. – hasan83

risposta

16

Come API reference dice layout_weight è un attributo di LinearLayout, quindi non può essere utilizzato con altri ViewGroups come, ad esempio, RecyclerView e ListView. Invece, devi impostare l'altezza dell'oggetto a livello di programmazione.

Dal momento che sembra preoccupato per la pulizia del codice, penso che questo sia un piuttosto soluzione elegante nel caso in cui si utilizza un RecyclerView:

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = LayoutInflater 
      .from(parent.getContext()) 
      .inflate(R.layout.item_list, null); 

    int height = parent.getMeasuredHeight()/4; 
    int width = parent.getMeasuredWidth(); 

    view.setLayoutParams(new RecyclerView.LayoutParams(width, height)); 

    return new ViewHolder(view); 
} 
+3

'parent.getMeasuredHeight()' restituisce il valore '0'! –

0

Mi sono imbattuto in questo problema, come ho avuto un RecyclerView con voci variabili. Il mio RecyclerView orizzontale doveva contenere almeno tre viste senza straripare, così ho costruito le mie viste da ridimensionare in fase di runtime per adattarle allo schermo.

class MyRecyclerView extends RecyclerView.Adapter<ViewHolder> { 

    int mViewWidth; 

    public MyRecyclerView(Context context) { 
     mViewWidth = defineViewWidth(context); 
    } 

    private int defineViewWidth(Context context) { 
     int definedWidth = (int) context.getResources().getDimension(R.dimen.default_view_width); 
     DisplayMetrics dm = new DisplayMetrics(); 
     WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
     wm.getDefaultDisplay().getMetrics(dm); 
     if (definedWidth * 3 > dm.widthPixels) { 
     return dm.widthPixels/3; 
     } 
     return definedWidth; 
    } 

    ... 

} 

volta che avete una larghezza definita, è necessario impostare la larghezza di vista:

@Override 
public ViewHolder onCreateViewHolder(ViewHolder holder, int position) { 
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent, false); 
    ViewGroup.LayoutParams params = v.getLayoutParams(); 
    params.width = mViewWidth; 
    v.setLayoutParams(params); 
    return new ViewHolder(v); 
} 

Si potrebbe facilmente modificare questo per assicurarsi che il RecyclerView si inserisce il maggior numero di elementi (in verticale o in orizzontale), come si bisogno.

5

Prova questa, lavoro per me

int weight = 3; //number of parts in the recycler view. 

@Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View rowView = LayoutInflater.from(parent.getContext()).inflate(R.layout.row,parent,false); 
     rowView.getLayoutParams().height = parent.getHeight()/weight; 
     return new ViewHolder(rowView); 
    } 
+0

si ha un errore di sintassi, dovrebbe essere parent.getContext(), la modifica è troppo piccola per me da modificare. –