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

120
12

Я создаю представление, подобное EPG, для которого у меня есть несколько горизонтальных RecyclerView (в виде телевизионных программ), инкапсулированных внутри 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, поскольку я не могу понять, как прокручивать другие представления.


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


Просмотр ТВ-каналов

спросил(а) 2015-08-04T17:56:00+03:00 5 лет, 1 месяц назад
1
Решение
69

HorizontelScrollView


{

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


{

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


}


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


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

ответил(а) 2015-10-23T16:39:00+03:00 4 года, 11 месяцев назад
59

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


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

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

ответил(а) 2015-11-17T14:33:00+03:00 4 года, 10 месяцев назад
40

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

ответил(а) 2017-12-18T20:49:00+03:00 2 года, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема