-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Проматывать рекомендации к элементу, открытому из публичного экрана плейлиста через контекстное меню "играть в плейлисте" #172
Comments
Реализовал прокрутку через ручной перебор элементов в адаптере (коммита пока нет). Режим включен при открытии ролика через контекстное меню "играть в плейлисте" в публичном экарне плейлиста и при клике на ролик в экране плейлиста в настройках. Если элемент плюс-минус в начале списка, работает. Если промотать плейлист дальше, то не работает, т.к. PagedListAdapter загружает ролики из базы данных не сразу, а порциями по мере прокрутки списка, и в адаптере после некоторого индекса по порядковому номеру можно получить только null. Пока оставлю как есть. Возможные варианты сделать идеально:
|
оставлю этот код здесь: if (videoId != VideoItem.ID_NONE) {
playerService.playVideoItem(videoId, false);
if (WatchVideoActivity.this.getIntent().getBooleanExtra(PARAM_SCROLL_TO_IN_RECOMMENDATIONS, false)) {
recommendationsListener = new RecommendationsListener() {
@Override
public void onFirstItemLoaded(final VideoItem firstItem) {
// попробуем промотать список рекомендаций до выбранного видео
int pos = -1;
// сейчас сюда попадаем только в одном случае - если ролик выбран в
// публичном экране плейлиста через меню "играть в плейлисте" -
// в этом случае у нас для рекомендаций будет создан VideoItemPagedListAdapter
final VideoItemPagedListAdapter adapterAsPaged = (VideoItemPagedListAdapter) videoList.getAdapter();
for (int i = 0; i < adapterAsPaged.getItemCount(); i++) {
if (adapterAsPaged.getItem(i) == null) {
// если в качестве элементов пошли null, значит
// адаптер в этот заход не загрузил ролики до нужного;
// найти индекс ролика в незагруженном списке будет
// довольно проблематично, поэтому в этой ситуации сейчас
// просто ничего не делаем
break;
} else if (adapterAsPaged.getItem(i).getId() == videoId) {
pos = i;
break;
}
}
if (pos != -1) {
playerService.getVideoListPosMap().put(videoId, pos);
playerService.setVideoListCurrentPosition(pos);
videoList.scrollToPosition(pos);
}
}
};
} else {
recommendationsListener = new RecommendationsListener() {
@Override
public void onFirstItemLoaded(final VideoItem firstItem) {
// проверим, совпадает ли первый элемент в рекомендациях с роликом,
// который загружен; если совпадает, то установим индекс текущего ролика
// нулём, чтобы плеер понимал, что загруженное видео - первое в списке
// рекомендаций
if (videoId == firstItem.getId()) {
playerService.getVideoListPosMap().put(videoId, 0);
playerService.setVideoListCurrentPosition(0);
}
}
};
}
} и реализую по этой схеме:
|
Вот так получилось норм. Ограничения на расстояние от начала списка теперь нет. Один раз, правда, показалось, что поймал глюк с неправильным элементом, но, может, что-то неправильно увидел из-за тормозов эмулятора. Заодно получилось этим способом применить промотку к выбранному элементу при открытии ролика по адресу в списках "новое для всех плейлистов", "новое для плейлиста", "добавить плейлист", т.е. там, где списки берут не из базы данных. Но срабатывает не всегда, если умотать далеко вниз список. |
Переходим в экран плейлиста, выставляем настройки фильтра/сортировки, кликаем на ролике в списке и выбираем меню "играть в плейлисте".
На экране плеера:
Таким обрзом появится возможность, к примеру, продолжить просмотр плейлиста начиная с нужного ролика, который выбран на экране плейлиста, а не после откртия на экране плеера.
Связанный тикет (там этот случай следует исключить): #170
The text was updated successfully, but these errors were encountered: