it-swarm.com.ru

Как создать функциональность как приложение TikTok/Musical.ly для Android?

Экран 1: GridView

 enter image description here

Экран 2: Страница сведений

 enter image description here

Задача Достигнуть:

1) Загрузите все видео в gridview с сервера.

2) Пользователь нажимает на любую позицию элемента gridview.

3) Откройте и воспроизведите конкретное видео на подробном экране. 

4) На вертикальной прокрутке воспроизводите следующее или предыдущее видео.

Текущая реализация:

GridFragment {
    ArrayList<VideoPostModel> videoPostList;
    RecyclerView gridView;

    onnItemClick() {
        Intent intent  = new Intent(this, DetailActivity.class);
        intent.putExtra("data", videoPostList);
        intent.putExtra("click_index", clickedIndex);
        intent.putExtra("pagination_index", paginationIndex);
        startActivity(intent);
    }
}

DetailActivity {
    VerticlaViewPager vertiCalViewPager;
    ArrayList<VideoPostModel> videoPostList;

    onCreate() {
        videoPostList = getIntent().getParcelableArrayListExtra("data");
        clickedIndex = getIntent().getIntExtra("clickindex", 0);
        paginationIndex = getIntent().getIntExtra("pagination_index", 0);

        VideoFragmentStatePagerAdapter viewPagerAdapter = new VideoFragmentStatePagerAdapter(videoPostList);
        vertiCalViewPager.setAdapter(viewPagerAdapter);
    }
}

Проблема:

Если videoPostList имеет больше данных (около 100+ объектов VideoPostModel) при передаче данных из фрагмента в действие, то приложение завершает работу, так как существует ограничение отправки данных с намерением ( https://stackoverflow.com/a/37054839/3598052 ).

Hacky Альтернативы:

1) Статический массив

2) Arraylist в классе приложений

Ищите решения OPTIMAL и EFFICIENT для достижения вышеуказанной функциональности. 

Любое предложение, ссылка или код в направлении достижения этой цели будет высоко оценен, и заранее спасибо.

Обновление 1:

Другое решение, которое я нашел, - это передача данных с помощью enum, но, согласно комментариям, я не уверен в его производительности. Ссылка: https://stackoverflow.com/a/14706456/3598052

3
Chitrang

Я думаю, что вы можете написать в деятельности или использовать Arraylist в приложении, как вы упомянули. Или это может быть библиотека, которая недавно появилась в Android Jetpack . По своей природе он похож на Arraylist.

ViewModel объекты, которые облегчают управление и хранение данных . Он позволяет получать доступ к данным при различных действиях или фрагментах в приложении. Вы пробуете это и надеетесь, что это будет полезно для вас

1
Chanh

У вас есть несколько вариантов. Я выскажу свое мнение здесь.

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

Другое решение, которое я нашел, - передача данных с помощью enum, но согласно комментарии я не уверен насчет его производительности

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

В поисках оптимального и эффективного решения для достижения выше функциональность.

Составьте статический список и сделайте его пустым после использования. будет наиболее эффективным и простым способом. Вы можете сделать List NULL в onDestroy() вашего фрагмента.

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

в деятельности

showFragment();
ApplicationClass.list = myList;

Во фрагменте 

onViewCreated(){
...
setAdapter(ApplicationClass.list);
...
}

onDestroy(){
   ApplicationClass.list = null;
}

Важный

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

Таким образом, при таком подходе вы передадите фрагменты только нескольким элементам. тогда вы будете делать разбиение на страницы во фрагменте. 

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

Правка

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

Вы можете сделать 2 вещи в качестве решения . 1. Запросите ограниченные данные сразу, скажем, 50-60 пунктов за запрос. 2. Вы можете отобразить и удалить ненужные поля из списка при передаче намерения.

Я бы предпочел первый. 

0
Khemraj