Нет хорошего примера о RecyclerView и StaggeredGridLayoutManager в Android Docs

Я не мог найти лучшего примера для использования RecyclerView с StaggeredGridLayoutManager . Даже в Android Docs .

Q1. Мне нужны некоторые примеры, которые могут дать правильное объяснение того, как использовать RecyclerView с StaggeredGridLayoutManager .

Q2. Может ли кто-нибудь сказать мне, можно ли создать следующий макет, используя RecyclerView с StaggeredGridLayoutManager

пример

До сих пор я нашел эту ссылку, которая совсем не полезна.

Я также нашел эту ссылку для cardlib, но она слишком сложна в реализации и имеет слишком много зависимостей, что увеличит размер моего приложения без необходимости.

    Тем, кто все еще поднимается по этому вопросу.

    Вы можете изменить следующий код в соответствии с вашими потребностями:
    Сначала добавьте библиотеки зависимостей для Android RecyclerView и 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' 

    Ваш основной вид деятельности activity_main.xml будет просто похож на

     <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> 

    Определите расположение карты в файле макета с именем 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> 

    Определите этот макет как класс 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; } } 

    Определите пользовательский адаптер SampleRecyclerViewAdapter для заполнения карт

     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(); } } 

    Нам также нужен зритель для каждого объекта ItemObject . Поэтому определите класс 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(); } } 

    Теперь в MainActivity назначьте экземпляр StaggeredGridLayoutManager для recycler_view, чтобы определить, как будут отображаться компоненты.
    Также заполняйте карты, используя экземпляр SampleRecyclerViewAdapter , следующим образом

     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; } } 

    Результат будет выглядеть примерно так: Два выхода Colums

    Для вашего требования вы можете включить ImageView в book_list_item.xml и заполнить его соответствующим образом в SampleViewHolders
    Также обратите внимание, чтобы изменить количество столбцов от 2 до 3.

    Вы можете изменить объявление в MainActivity как

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

    Что даст такой результат Вывод трех столбцов

    Вот еще один простой учебник

    Предполагая, что вы уже создали адаптер и инициализировали RecyclerView, следующий код должен делать то, что вы ищете.

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

    Для получения дополнительной справки и документации, пожалуйста, проверьте следующую ссылку: https://developer.android.com/reference/android/support/v7/widget/StaggeredGridLayoutManager.html

    Наши друзья «Генри» хорошо объясняют здесь .

    И я думаю, что ниже конструктор подходит для большинства целей:

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