如何为Android应用程序创建TikTok / Musical.ly功能?

时间:2018-11-03 04:01:28

标签: android android-layout android-fragments android-intent android-viewpager

屏幕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在将数据从片段传递到活动时有更多数据(VideoPostModel的大约100个以上的对象),则应用会崩溃,因为使用intent(https://stackoverflow.com/a/37054839/3598052)发送数据存在局限性。

其他选择

1)静态数组列表

2)应用程序类中的数组列表

正在寻找 OPTIMAL和EFFICIENT 解决方案以实现上述功能。

对于实现此目标的任何建议,参考链接或代码,将深表感谢,并在此先感谢。

更新1:

我发现的另一个解决方案是使用枚举传递数据,但是根据注释,我不确定它的性能。参考:https://stackoverflow.com/a/14706456/3598052

3 个答案:

答案 0 :(得分:1)

我认为您可以编写活动或在应用程序中使用Arraylist,如上所述。也可能是最近出现在Android Jetpack中的一个库。它本质上与应用程序中的Arraylist类似。

ViewModel对象,可以更轻松地管理和存储数据。 它使您可以访问应用程序中不同活动或片段处的数据。您尝试一下,希望对您有用

答案 1 :(得分:0)

您有几种选择。我将我的意见放在这里。

最简单的方法是在活动或应用程序级别创建静态列表。只要确保使用后将其设为NULL,就可以释放列表内存。

  

我发现的另一个解决方案是使用枚举传递数据,但是按照   评论我不确定它的性能

上述每种方法肯定会有一些差异。但这不是可测量的差异,因为每种方法都将List放入内存中,使用它,然后释放它。

  

寻找实现上述目标的最佳和高效解决方案   功能。

创建静态列表,并在使用后使其为NULL。将是最有效,最简单的方法。 您可以在片段的onDestroy()中使列表为NULL。

您可以使用LiveData,但我认为添加LiveData库仅用于应用程序中的一种用途不是一个好主意。另外,您需要首先了解它。因此,您可以使用静态列表。

活动中

showFragment();
ApplicationClass.list = myList;

在片段中

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

onDestroy(){
   ApplicationClass.list = null;
}

重要

从服务器一次提取所有数据绝不是一个好主意。请进行分页,这是您的应用程序最需要的,因为一次可以有成千上万的用户。

因此,通过这种方法,您将仅将少量项目传递给Fragment。然后您将在Fragment中进行分页。

这种方法需要一点时间来改变流量。但这是最可靠的方式

编辑

如果您已经在使用分页并且一次仍然获取大量数据,那么这又是一个问题。因为使用分页来逃避这些内存问题。

您可以做两件事作为解决方案。  1.一次要求提供有限的数据,每个请求说50至60个项目。  2.您可以在传递意图时映射并从列表中删除不必要的字段。

我希望第一个。

答案 2 :(得分:0)

我知道我来晚了,但是这对将来的访客有帮助。

添加分页并使用arraylist和单击的位置传输数据,以使用intent&来详细说明活动,然后设置单击位置的当前位置。 像viewpager.setCurrentPosition(clickedPosition);