2015-08-16 28 views
7

Sto usando verticale StaggeredGridLayoutManager per visualizzare alcune miniature. Ogni riga contiene un cardview con larghezza 1 pollice e altezza 150dp. La mia domanda è: come posso impostare il conteggio dello span della griglia sfalsato per usare la larghezza fisica disponibile dello schermo?Come impostare il conteggio dello span della griglia sfalsato per utilizzare la larghezza dello schermo disponibile?

CardViewRow.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:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_margin="5dp" 
    android:orientation="vertical" 
    card_view:cardCornerRadius="0dp" 
    card_view:cardUseCompatPadding="true" > 


    <LinearLayout 
     android:gravity="center" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:background="@drawable/card_selector" 
     android:orientation="vertical"> 
     <FrameLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 


     <ImageView 
      android:id="@+id/thumbnail" 
      android:layout_width="300dp" 
      android:layout_height="150dp" 
      android:scaleType="centerCrop"/> 

      <LinearLayout 
       android:weightSum="2" 
       android:padding="5dp" 
       android:layout_gravity="bottom" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:orientation="horizontal" 
       android:background="#80000000"> 

       <TextView 
        android:id="@+id/size_txt" 
        android:layout_weight="1" 
        android:textSize="12sp" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:textColor="@color/silver" 
        android:gravity="left"/> 
       <TextView 
        android:layout_weight="1" 
        android:gravity="right" 
        android:textColor="@color/silver" 
        android:id="@+id/time_txt" 
        android:textSize="12sp" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content"/> 

      </LinearLayout> 
      <View 
       android:id="@+id/selector" 
       android:visibility="invisible" 
       android:background="#950096ff" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"> 

      </View> 
     </FrameLayout> 
     <TextView 
      android:id="@+id/title_txt" 
      android:padding="8dp" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:maxLines="5" /> 
     </LinearLayout> 


</android.support.v7.widget.CardView> 

Attualmente sto usando questo codice. (Credits: mstrengis)

DisplayMetrics metrics = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(metrics); 
     int cardWidth =(int) metrics.xdpi; //CardWidth==1Inch. 
     int spans = (int) Math.floor(mRecyclerView.getContext().getResources().getDisplayMetrics().widthPixels/(float) cardWidth); 
     sglm.setSpanCount(spans); 

/* Questo funziona perfettamente sul mio Nexus 5 e scheda di Samsung, ma sul mio cellulare Lenovo la larghezza della carta è inferiore a 1,5 cm e conta arco è più di quello che mi aspettavo * /.

+0

hai controllato doc sviluppatore Android per questo layout? [StaggeredGridLayoutManager] (https://developer.android.com/reference/android/support/v7/widget/StaggeredGridLayoutManager.html) dai un'occhiata a questa funzione setGapStrategy (int) – HMG

risposta

4
int spans = (int) Math.floor(recyclerView.getContext().getResources().getDisplayMetrics().widthPixels/(float) cardWidth); 
    RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager(); 
    if(layoutManager instanceof StaggeredGridLayoutManager) { 
     ((StaggeredGridLayoutManager) layoutManager).setSpanCount(spans); 
    } 

e quindi utilizzare RecyclerView.ItemDecoration per aggiungere spaziatura tra le campate

+0

non funziona su alcuni dispositivi lenovo –

+0

prova questo metodo per calcolare pixel di densità http://pastie.org/10378788 cardWidth = dp (75); // Aproximetly 1inch cardHeight = dp (150); – mstrengis