-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # 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: