Pinterest как Grid в Android

Я хочу построить сетку, как в приложении Pinterest на Android.

Я начал расширять AdapterView<ListAdapter>, но я не могу заставить работать многие вещи (например, эффект сверхпрокрутки), поэтому после отказа от идеи расширения AbsListView теперь я начинаю думать, что лучше расширить ListView и переопределить метод layoutChildren().

Что вы думаете?

Спасибо


person Matroska    schedule 15.09.2012    source источник
comment
› AntipodalWall — это автономная библиотека, разработанная для обеспечения так называемого макета сетки masonry для Android (во многом похожего на приложение Pinterest). Проверьте этот проект AntipodalWall   -  person Nam Vu    schedule 10.10.2012
comment
Вы узнали решение?   -  person Nam Vu    schedule 15.10.2012
comment
Решение состоит в том, что я создаю собственный компонент AdapterView. Я поделюсь компонентом на github, когда он будет завершен.   -  person Matroska    schedule 15.10.2012
comment
Спасибо, пожалуйста, разместите свой отличный код здесь   -  person Nam Vu    schedule 15.10.2012
comment
Это займет некоторое время, потому что я не могу найти хороших руководств по созданию AdapterView, кроме одного от Sony Ericsson, в котором отсутствуют многие функции.   -  person Matroska    schedule 21.10.2012
comment
@Matroska Вы нашли какое-нибудь хорошее решение?   -  person Parag Chauhan    schedule 09.06.2013
comment
В своих проектах я использую: github.com/GDG-Korea/PinterestLikeAdapterView Это очень < b>простота в использовании и потребление памяти эффективно !Похоже на это   -  person Andrii Kovalchuk    schedule 28.05.2014


Ответы (3)


Для этого нам не понадобится какая-либо внешняя библиотека, поскольку собственный RecyclerView для Android позволяет реализовать макет кладки Pinterest, просто изменив диспетчер макетов RecyclerView.

mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
RecyclerAdapter adapter = new RecyclerAdapter(this);
mRecyclerView.setAdapter(adapter);

Прохладный. Это очень просто, но маржа на моем LinearLayout не работает. Итак, вот быстрое решение.

SpacesItemDecoration decoration = new SpacesItemDecoration(16);
mRecyclerView.addItemDecoration(decoration);

Класс SpacesItemDecoration:

public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
private final int mSpace;

public SpacesItemDecoration(int space) {
    this.mSpace = space;
}

@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
    outRect.left = mSpace;
    outRect.right = mSpace;
    outRect.bottom = mSpace;

    // Add top margin only for the first item to avoid double space between items
    if (parent.getChildAdapterPosition(view) == 0)
        outRect.top = mSpace;
    }
}

ссылка на пример Github

мои окончательные результаты

person Anjal Saneen    schedule 19.08.2017

Я решил это, скопировав и обновив Android StaggeredGridView. https://github.com/maurycyw/StaggeredGridView . Кажется, отлично работает для создания эффекта, который вы ищете. Перед этим я пошел по кроличьей норе, скопировав исходный код Android в отдельную библиотеку (с которой я начал работать), пока не увидел экспериментальный StaggeredGridView. Это намного проще, чем мой старый проект библиотеки «BrickView», поэтому я заменил его.

person Maurycy    schedule 16.12.2012
comment
отлично, дайте мне знать, как это происходит! - person Maurycy; 20.12.2012
comment
StaggeredGridView имеет много проблем, и их можно легко найти, повернув экран после некоторой прокрутки. Я предлагаю использовать другую библиотеку. Я отправил новое предложение, если хотите. - person android developer; 09.09.2013

Это может быть достигнуто небольшим изменением существующего recyclerview и его адаптера.

Изменения, которые необходимо сделать: 1.В вашей деятельности/фрагменте

uploadMediaAdapter = new UploadMediaAdapter(getActivity(),mediaArrayList);    
rv_uploaded.setAdapter(uploadMediaAdapter);
int spanCount = 2;
rv_uploaded.setLayoutManager(new StaggeredGridLayoutManager(spanCount, StaggeredGridLayoutManager.VERTICAL));

2.Ваш элемент списка Recyclerview:

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="@dimen/dim_5"
    app:cardCornerRadius="@dimen/dim_5"
    app:cardUseCompatPadding="true"
    android:clipToPadding="true"
    >

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >

        <android.support.v7.widget.AppCompatImageView
            android:id="@+id/img_prev_photo"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:scaleType="fitXY"
            android:adjustViewBounds="true"
            />

        <android.support.v7.widget.AppCompatTextView
            android:id="@+id/txt_progress_date"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="8th August 2019"
            android:textSize="@dimen/text_size_17"
            android:textStyle="bold"
            android:layout_gravity="bottom|center_horizontal"
            android:textColor="@color/color_white"
            />

    </FrameLayout>


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

Делая это, вы можете достичь того, что вы ищете!

person Vishv Shroff    schedule 26.12.2019