Как создать функциональность как приложение TikTok / Musical.ly для Android? - PullRequest
0 голосов
/ 03 ноября 2018

Экран 1: GridView

enter image description here

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

enter image description here

Достижение задачи:

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

2) Пользователь щелкает мышью в любой позиции элемента сетки.

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

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

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

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

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

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

В поисках ОПТИМАЛЬНОГО и ЭФФЕКТИВНОГО решения для достижения выше функциональность.

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

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

в действии

showFragment();
ApplicationClass.list = myList;

Фрагмент

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

onDestroy(){
   ApplicationClass.list = null;
}

Важно

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

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

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

Редактировать

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

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

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

0 голосов
/ 05 ноября 2018

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

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

...