屏幕1:GridView
屏幕2:详细信息页面
任务实现:
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
答案 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)
;