Прокрутите несколько горизонтальных RecyclerView вместе

Я создаю вид, похожий на EPG, для которого у меня есть несколько горизонтальных RecyclerView s (как телевизионные программы), инкапсулированные в LinearLayout. Когда я прокручиваю один из RecyclerView, я хочу, чтобы остальные виды прокручивались вместе.

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);

    layoutContent.setWeightSum(epg.getChannels().size());

    //prepare recycler views and add into layoutContent based on epg channels
    for(EPG.Channel ch : epg.getChannels()){
        AppLog.error(TAG, "Creating RecyclerView for: " + ch.getDisplayName());

        //create new recycler view
        final RecyclerView rv = new RecyclerView(layoutContent.getContext());
        lstRecyclerViews.add(rv);

        //set layout manager
        rv.setLayoutManager(new LinearLayoutManager(layoutContent.getContext(), LinearLayoutManager.HORIZONTAL, false));

        //create adapter
        rv.setAdapter(new MyAdapter(ch.getPrograms()));
        rv.setItemAnimator(new DefaultItemAnimator());

        //add into parent layout
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 0);
        lp.weight = 1;
        layoutContent.addView(rv, lp);
    }
}

Я пытался добавить прослушиватель прокрутки к моим представлениям, но я запутался с RecyclerView.OnScrollListener Это метод onScrolled, так как я не могу понять, как прокручивать другие представления.

Любая помощь / предложение будет полезно.

Просмотр телеканалов

4 ответа

HorizontelScrollView

{

Линейный макет

{

Вертикальный список горизонтальных представлений переработчика, переопределение горизонтального представления переработчика LayoutManager's
Метод canScroolhorizontally() возвращает false, чтобы они все прокручивались вместе в соответствии с Grand Parent ScrollView.

}

Нашей основной задачей является прокрутка этого вертикального списка горизонтальных видов рециркулятора по горизонтали, сначала я попытался сохранить их все в горизонтальном представлении прокрутки, но это то, что система Android явно отклоняет, поэтому я сохранил одну линейную компоновку (в моем случай вертикально ориентирован) в качестве посредника.

поэтому сетка epg теперь может прокручиваться по вертикали, поскольку они находятся внутри одного вертикального вида рециркулятора, а также по горизонтали из-за горизонтальной прокрутки. и мы не должны разрешать горизонтальную прокрутку списка независимо, поэтому я расширил layoutmanager и запретил горизонтальную прокрутку, теперь они прокручиваются только под grandParent scroll.

Вам необходимо всегда пересчитывать положение текущих предметов в горизонтальных представлениях переработчика (следующий час). После прокрутки за один час пересчитать позиции других на основе небольшого количества движения прокрутки, произошедшего в прикосновении к грн.

Затем переопределить onViewAttachedToWindow в адаптере и метод использования scrollToPositionWithOffset от LinearLayoutManager особенно HRV, чтобы установить его в правильное положение.

Также при расчете движения дх не забудьте отключить onScrolled метод, когда палец опущен, чтобы избежать многократной обработки одного и того же события.

Вам нужно добавить текстовые представления в горизонтальных рядах. Длина текстового просмотра зависит от продолжительности программы. Я разместил пример проекта на Github. Не стесняйтесь клонировать. https://github.com/xardox69/android_EPG

FlexboxLayout (сделано Google) позволяет сделать что-то подобное с RecyclerView и FlexboxLayoutManager, Начиная с его версии 3.0 (28 июня 2017 года) вы можете перетаскивать его горизонтально.

Для вашего примера используйте это так:

    FlexboxLayoutManager layoutManager = new FlexboxLayoutManager(getActivity());
    layoutManager.setFlexDirection(FlexDirection.ROW);
    layoutManager.setFlexWrap(FlexWrap.WRAP);
    recyclerView.setLayoutManager(layoutManager);

И не забудьте установить ширину вашего RecyclerView на большее число, чем размер экрана, для прокрутки не используйте match_parent:

<android.support.v7.widget.RecyclerView
        android:layout_width="3600dp"
        android:layout_height="match_parent"/>

Примечание: ViewHolders перерабатываются по строкам, а не по столбцам, поэтому будьте осторожны, если у вас слишком тяжелые предметы на очень длинных RecyclerView

Другие вопросы по тегам