Двустороннее представление Android - Horizontal Recyclerview внутри Vertical Recyclerview

Я хочу создать представление динамической загрузки, которое содержит горизонтальное представление повторного использования внутри вертикального представления повторного использования, а вертикальное представление повторного использования должно быть внутри Scrollview, поскольку основное представление содержит еще несколько компонентов представлений. Итак, моя динамическая иерархия выглядит следующим образом: -

 Scrollview [
  | Viewpager --
  | AdView --
  | Vertical Items - Recyclerview {
       1) [Horizontal Recyclerview {1.1, 1.2, 1.3} [Lazy Loading of Items]]
       2) [Horizontal Recyclerview {2.1, 2.2, 2.3} [Lazy Loading of Items]]
       3) [Horizontal Recyclerview {3.1, 3.2, 3.3} [Lazy Loading of Items]]
       4) [Horizontal Recyclerview {4.1, 4.2, 4.3} [Lazy Loading of Items]]
       .
       .
       .
    [Lazy Loading of Items in Vertical Direction also]
       }
   | Some Another View --
          ]

Есть ли лучший способ добиться такого вида просмотра в android. Таким образом, динамическая загрузка предметов может быть достигнута как в горизонтальном, так и в вертикальном направлениях? Есть ли какие-либо библиотеки в Android? Пожалуйста, предложите мне несколько хороших примеров этого.


person moody_user    schedule 18.03.2018    source источник
comment
Просто глядя на вашу иерархию, я могу сказать, что вы столкнетесь с проблемой прокрутки внутри прокрутки, и, вероятно, ваш пейджер просмотра не будет отображать содержимое ваших фрагментов, если он не имеет фиксированной высоты. Можете ли вы заставить просмотр пейджера работать с просмотром прокрутки? Я не могу помочь вам с проблемой ленивой загрузки, но, возможно, я могу помочь вам с проблемой прокрутки, если она у вас есть.   -  person Roni Castro    schedule 18.03.2018
comment
Это простой проект, который я сделал, чтобы исправить этот вид пейджера просмотра с проблемой прокрутки: github.com/roni-castro/multiple-scroll-solution   -  person Roni Castro    schedule 18.03.2018
comment
@RoniCastro Как вы думаете, это решит проблему поведения прокрутки?   -  person moody_user    schedule 19.03.2018
comment
Нужно было бы увидеть код или ваш макет, но основная проблема пейджера просмотра заключается в том, что он не очень хорошо работает с scrollView или вложеннымScrollView, и если внутри фрагмента есть представление переработчика, необходимо удалить его прокрутку, установив свойство setNestedScrollingEnable(false), чтобы избежать медленной прокрутки. Если вам требуется разбиение на страницы элементов вашего recyclerview, это может быть еще одной проблемой.   -  person Roni Castro    schedule 20.03.2018
comment
Вот несколько ссылок, которые помогли мне решить эту проблему с прокруткой: вопросов/30580954/ stackoverflow.com/questions/47887875/ linkedin.com/pulse/   -  person Roni Castro    schedule 20.03.2018
comment
@RoniCastro Я думаю, вы ошиблись направлением, чувак, Vertical Recyclerview не находится внутри фрагмента Viewpager. Все компоненты основных представлений располагаются по вертикали. Сначала будет viewpager для некоторых элементов с автоматической прокруткой. Затем второе представление - это рекламное представление, а затем мне нужно установить динамическое вертикальное представление recyclerview для элементов с ленивой загрузкой, которое будет содержать элементы горизонтального просмотра recyclerview (ленивая загрузка). Все, что мне нужно, чтобы установить представления в компоненте просмотра прокрутки.   -  person moody_user    schedule 20.03.2018


Ответы (1)


Лучше всего использовать RendererRecyclerViewAdapter.

Шаг 1. добавьте ViewModel интерфейс к вашему простому элементу

public class SimpleItem implements ViewModel {
    /* your getters */
}

Шаг 2. Создайте ViewBinder для вашего простого элемента

private ViewRenderer getSimpleViewBinder() {
    return new ViewBinder<>(
        R.layout.simple_item, /* your item layout */
        SimpleItem.class, /* your model class */
        (model, finder, payloads) -> {
            /* your binding */
            finder.setText(R.id.textView, model.getText());
    });
}

Шаг 3. Расширьте DefaultCompositeViewModel и добавьте уникальный идентификатор горизонтального элемента.

public class HorizontalViewModel extends DefaultCompositeViewModel {

    private int mID;

    public HorizontalViewModel(int ID, List<? extends ViewModel> items) {
        super(items);
        mID = ID;
    }

    public int getID() {
        return mID;
    }
}

Это ваш Горизонтальный предмет, который содержит все простые предметы внутри.

Шаг 4. Создайте HorizontalViewBinder

public class HorizontalViewBinder extends CompositeViewBinder<HorizontalViewModel> {

    public HorizontalViewBinder(int layoutID,
                                int recyclerViewID,
                                Class<HorizontalViewModel> type) {
        super(layoutID, recyclerViewID, type);
    }

    @Override
    public void bindView(HorizontalViewModel model, CompositeViewHolder holder) {
        super.bindView(model, holder);
        holder.getRecyclerView().addOnScrollListener(new EndlessScrollListener() {
            @Override
            public void onLoadMore(int page, int totalItemsCount) {
                holder.getAdapter().showLoadMore();
                /* sendLoadMoreRequest(model.getID()); */
            }
        });
    }

    @NonNull
    @Override
    public CompositeViewHolder createViewHolder(ViewGroup parent) {
        final CompositeViewHolder viewHolder = super.createViewHolder(parent);
        viewHolder.getAdapter().registerRenderer(new LoadMoreViewBinder(R.layout.load_more)); 
        /* don't forget to create load more layout */
        return viewHolder;
    }
}

Шаг 5. Создайте геттер для HorizontalViewBinder.

private ViewRenderer getHorizontalViewBinder() {
    return new HorizontalViewBinder<>(
        R.layout.horizontal_layout, /* your horizontal layout that contains RecyclerView */
        R.id.recycler_view, /* an ID of RecyclerView */
        HorizontalViewModel.class /* your created class, see Step 3 */
    );
}

Шаг 6. Инициализируйте в своем фрагменте/активности основной RendererRecyclerViewAdapter.

RendererRecyclerViewAdapter mRecyclerViewAdapter = new RendererRecyclerViewAdapter();
mRecyclerViewAdapter.registerRenderer(new Horizontal().registerRenderer(getHorizontalViewBinder().registerRenderer(getSimpleViewBinder())); /* register HorizontalViewBinder and SimpleViewBinder */
mRecyclerViewAdapter.setItems(getYourList());

Шаг 7. Добавьте LoadMoreListener в основной RecyclerView

mRecyclerView.addOnScrollListener(new EndlessScrollListener() {
    @Override
    public void onLoadMore(int page, int totalItemsCount) {
        mRecyclerViewAdapter.showLoadMore();
        /* send request to a server */
    }
});

Шаг 8. Создайте специальные ViewBinder для других ваших элементов: AdViewBinder, SomeAnotherViewBinder и зарегистрируйте их в своем адаптере. См. Шаг 1 и Шаг 2.


К вашему сведению: EndlessScrollListener — это ваша реализация LoadMoreListener.

Наслаждаться! :)

Если вам нужна дополнительная информация, см. вики-страницы: простые элементы, составные элементы, индикатор «Загрузить больше».

person Vitaly    schedule 18.03.2018