2015-04-15 6 views
28

Non ho trovato alcun esempio migliore per l'utilizzo di RecyclerView con StaggeredGridLayoutManager. Nemmeno in Android Docs.Nessun buon esempio di RecyclerView e StaggeredGridLayoutManager in Documenti Android

Q1. Ho bisogno di alcuni esempi che possano dare una spiegazione corretta su come usare RecyclerView con StaggeredGridLayoutManager.

Q2. qualcuno può dirmi se è possibile creare a seguito layout utilizzando RecyclerView con StaggeredGridLayoutManager

example

Finora ho trovato questo link, che non è affatto utile.

Ho anche trovato questo link per cardslib ma è troppo complesso nell'implementazione e ha troppe dipendenze che aumenteranno le dimensioni della mia app inutilmente.

+0

Si possono trovare questo esempio utile: https://github.com/dbleicher/recyclerview-grid-quickreturn – MojoTosh

+0

Mi piace questo esempio sia per RecyclerView e StaggeredGridLayoutManager: https: // guide .codepath.com/android/Usando-the-RecyclerView – Muz

risposta

3

Supponendo di aver già creato un adattatore e inizializzato RecyclerView, il codice seguente dovrebbe fare ciò che si sta cercando.

StaggeredGridLayoutManager staggeredGridLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL); 
recyclerView.setLayoutManager(staggeredGridLayoutManager); 

Per ulteriore riferimento e la documentazione si prega di consultare il seguente link: https://developer.android.com/reference/android/support/v7/widget/StaggeredGridLayoutManager.html

29

Per coloro che sono ancora in atterraggio su questa domanda.

Si potrebbe modificare il seguente codice secondo i vostri bisogni:
Prima aggiungere librerie di dipendenza per Android RecyclerView e CardView

compile 'com.android.support:appcompat-v7:23.4.0' 
compile 'com.android.support:cardview-v7:23.4.0' 
compile 'com.android.support:recyclerview-v7:23.4.0' 

Il layout principale attività activity_main.xml sarà semplicemente come

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="7dp" 
    tools:context=".MainActivity"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recycler_view" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:scrollbars="vertical" /> 

</RelativeLayout> 


Definire il layout di una scheda in un file di layout denominato book_list_item.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="wrap_content" 
android:layout_height="wrap_content" 
card_view:cardUseCompatPadding="true"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@android:color/white" 
    android:orientation="vertical"> 

    <TextView 
     android:id="@+id/BookName" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:padding="5dp" 
     android:textColor="@android:color/black" 
     android:textSize="16sp" /> 

    <TextView 
     android:id="@+id/AuthorName" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_below="@+id/country_photo" 
     android:background="#1976D2" 
     android:gravity="center_horizontal" 
     android:paddingBottom="8dp" 
     android:paddingTop="8dp" 
     android:text="@string/hello_world" 
     android:textColor="#ffffff" 
     android:textSize="13sp" /> 
</LinearLayout> 

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


Definire questo layout come classe ItemObject.java

public class ItemObject 
{ 
    private String _name; 
    private String _author; 

    public ItemObject(String name, String auth) 
    { 
     this._name = name; 
     this._author = auth; 
    } 

    public String getName() 
    { 
     return _name; 
    } 

    public void setName(String name) 
    { 
     this._name = name; 
    } 

    public String getAuthor() 
    { 
     return _author; 
    } 

    public void setAuthor(String auth) 
    { 
     this._author = auth; 
    } 
} 


Definire un adattatore personalizzato SampleRecyclerViewAdapter per popolare le carte

public class SampleRecyclerViewAdapter extends RecyclerView.Adapter<SampleViewHolders> 
{ 
    private List<ItemObject> itemList; 
    private Context context; 

    public SampleRecyclerViewAdapter(Context context, 
     List<ItemObject> itemList) 
    { 
     this.itemList = itemList; 
     this.context = context; 
    } 

    @Override 
    public SampleViewHolders onCreateViewHolder(ViewGroup parent, int viewType) 
    { 
     View layoutView = LayoutInflater.from(parent.getContext()).inflate(
      R.layout.book_list_item, null); 
     SampleViewHolders rcv = new SampleViewHolders(layoutView); 
     return rcv; 
    } 

    @Override 
    public void onBindViewHolder(SampleViewHolders holder, int position) 
    { 
     holder.bookName.setText(itemList.get(position).getName()); 
     holder.authorName.setText(itemList.get(position).getAuthor()); 
    } 

    @Override 
    public int getItemCount() 
    { 
     return this.itemList.size(); 
    } 
} 


Avremmo anche bisogno di un viewholder per ogni ItemObject.Quindi definire una classe SampleViewHolders

public class SampleViewHolders extends RecyclerView.ViewHolder implements 
    View.OnClickListener 
{ 
    public TextView bookName; 
    public TextView authorName; 

    public SampleViewHolders(View itemView) 
    { 
     super(itemView); 
     itemView.setOnClickListener(this); 
     bookName = (TextView) itemView.findViewById(R.id.BookName); 
     authorName = (TextView) itemView.findViewById(R.id.AuthorName); 
    } 

    @Override 
    public void onClick(View view) 
    { 
     Toast.makeText(view.getContext(), 
      "Clicked Position = " + getPosition(), Toast.LENGTH_SHORT) 
      .show(); 
    } 
} 

Ora in MainActivity, assegnare un'istanza di StaggeredGridLayoutManager per recycler_view per definire come appariranno i componenti.
popolano anche le carte utilizzando istanza di SampleRecyclerViewAdapter, come segue

public class MainActivity extends AppCompatActivity 
{ 
    private StaggeredGridLayoutManager _sGridLayoutManager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 
     recyclerView.setHasFixedSize(true); 

     _sGridLayoutManager = new StaggeredGridLayoutManager(2, 
      StaggeredGridLayoutManager.VERTICAL); 
     recyclerView.setLayoutManager(_sGridLayoutManager); 

     List<ItemObject> sList = getListItemData(); 

     SampleRecyclerViewAdapter rcAdapter = new SampleRecyclerViewAdapter(
      MainActivity.this, sList); 
     recyclerView.setAdapter(rcAdapter); 
    } 

    private List<ItemObject> getListItemData() 
    { 
     List<ItemObject> listViewItems = new ArrayList<ItemObject>(); 
     listViewItems.add(new ItemObject("1984", "George Orwell")); 
     listViewItems.add(new ItemObject("Pride and Prejudice", "Jane Austen")); 
     listViewItems.add(new ItemObject("One Hundred Years of Solitude", "Gabriel Garcia Marquez")); 
     listViewItems.add(new ItemObject("The Book Thief", "Markus Zusak")); 
     listViewItems.add(new ItemObject("The Hunger Games", "Suzanne Collins")); 
     listViewItems.add(new ItemObject("The Hitchhiker's Guide to the Galaxy", "Douglas Adams")); 
     listViewItems.add(new ItemObject("The Theory Of Everything", "Dr Stephen Hawking")); 

     return listViewItems; 
    } 
} 

uscita sarà simile a questa Two Colums Output

Per il vostro requisito, è possibile incorporare un ImageView in book_list_item.xml e popolarlo di conseguenza in SampleViewHolders
Inoltre, per modificare il numero di colonne da 2 a 3.

Si potrebbe cambiare dichiarazione MainActivity come

_sGridLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL); 
recyclerView.setLayoutManager(_sGridLayoutManager); 

che darà un output come questo Three Column Output

Ecco another simple tutorial

0

I nostri amici "Henry" hanno una buona e semplice spiegare here.

e penso che qui di seguito costruttore è adatto per gli usi più:

StaggeredGridLayoutManager(num , LinearLayoutManager.VERTICAL) 
// where 'num' is your columns count 
// LinearLayoutManager.VERTICAL = 1