Android:如何显示在点击时展开的分类视频缩略图列表?
Android: How can I display a list of categorised video thumbnails that expand on click?
首先我会告诉你我的想法。
CATEGORY 1
Video 1 | Video 2 | Video 3
Video 4 | Video 5 | Video 6
CATEGORY 2
Video 1 | Video 2 | Video 3
Video 4 | Video 5 | Video 6
实际上还有更多类别,但为了简短起见,我将其限制为两个。现在假设用户对类别 1 中的更多视频感兴趣,并且假设该类别中有 10 个视频。我希望视图是这样的:
CATEGORY 1
Video 1 | Video 2 | Video 3
Video 4 | Video 5 | Video 6
Video 7 | Video 8 | Video 9
Video 10
CATEGORY 2
Video 1 | Video 2 | Video 3
Video 4 | Video 5 | Video 6
所以在这种情况下,类别及其视频仍然可见,但对于类别一,列表将完全展开。如果用户再次单击类别 1,结果将与顶部的列表相同。
目前正在使用一个GridView来显示所有的视频,没有类别的分离和扩展类别的可能性。由于 GridView 不支持部分,因此它不适合新方法。
我考虑过为每个类别使用一个带有 GridView 的 ScrollView,但是如果我展开其中一个 GridView,就会发生 OutOfMemoryException,因为该类别的所有图像都会一次加载。除此之外,这感觉有点老套,我认为有更好的解决方案来解决这个问题。
我看到的另一种选择是 ExpandableListView。但我不知道的是,是否可以向其中添加一个部分,其中包含一些已经可见的项目,并在单击后显示其余项目。
你们认为这是一个不错的选择,还是我应该考虑考虑其他选择?感谢您的努力!
使用自行管理内存的 RecyclerView。
添加对gradle文件的依赖:
compile 'com.android.support:recyclerview-v7:23.1.1'
然后,here is basic of RecyclerView
好的,现在假设您知道如何使用 RecyclerView。
我们定义了两个级别的数据:
- 第一级模型是一个带有列表的类别,
- 二级模型是电影。
所以二级视图定义:
- 第一级视图是一个 RecyclerView 包含许多 RecyclerView(取决于您的类别数)
- 二级视图是一个 RecyclerView 包含很多 Movie。
FirstAdapter 中的关键代码:
// click show only 6, click again show all
public void showOrCollapse() {
if (showAll && secondModel2Show.size() >= 6) {
this.secondModel2Show = this.secondModel2Show.subList(0, 6);
} else {
this.secondModel2Show = this.secondModels;
}
this.notifyDataSetChanged();
showAll = !showAll;
}
SecondAdapter 中的 ket 代码
// bind data to view
@Override
public void onBindViewHolder(FirstHolder holder, int position) {
FirstModel firstModel = firstModels.get(position);
holder.cat.setText(firstModel.getCat());
final SecondAdapter secondAdapter = new SecondAdapter(firstModel.getSecondModels());
holder.rcv.setLayoutManager(new FullyGridLayoutManager(activity, 3));
holder.rcv.setAdapter(secondAdapter);
holder.cat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
secondAdapter.showOrCollapse();
}
});
}
第一个模型
public class FirstModel {
private String cat;
private List<SecondModel> secondModels;
}
第二个模型
public class SecondModel {
private int res;
}
首先我会告诉你我的想法。
CATEGORY 1
Video 1 | Video 2 | Video 3
Video 4 | Video 5 | Video 6
CATEGORY 2
Video 1 | Video 2 | Video 3
Video 4 | Video 5 | Video 6
实际上还有更多类别,但为了简短起见,我将其限制为两个。现在假设用户对类别 1 中的更多视频感兴趣,并且假设该类别中有 10 个视频。我希望视图是这样的:
CATEGORY 1
Video 1 | Video 2 | Video 3
Video 4 | Video 5 | Video 6
Video 7 | Video 8 | Video 9
Video 10
CATEGORY 2
Video 1 | Video 2 | Video 3
Video 4 | Video 5 | Video 6
所以在这种情况下,类别及其视频仍然可见,但对于类别一,列表将完全展开。如果用户再次单击类别 1,结果将与顶部的列表相同。
目前正在使用一个GridView来显示所有的视频,没有类别的分离和扩展类别的可能性。由于 GridView 不支持部分,因此它不适合新方法。
我考虑过为每个类别使用一个带有 GridView 的 ScrollView,但是如果我展开其中一个 GridView,就会发生 OutOfMemoryException,因为该类别的所有图像都会一次加载。除此之外,这感觉有点老套,我认为有更好的解决方案来解决这个问题。
我看到的另一种选择是 ExpandableListView。但我不知道的是,是否可以向其中添加一个部分,其中包含一些已经可见的项目,并在单击后显示其余项目。
你们认为这是一个不错的选择,还是我应该考虑考虑其他选择?感谢您的努力!
使用自行管理内存的 RecyclerView。
添加对gradle文件的依赖:
compile 'com.android.support:recyclerview-v7:23.1.1'
然后,here is basic of RecyclerView
好的,现在假设您知道如何使用 RecyclerView。
我们定义了两个级别的数据:
- 第一级模型是一个带有列表的类别,
- 二级模型是电影。
所以二级视图定义:
- 第一级视图是一个 RecyclerView 包含许多 RecyclerView(取决于您的类别数)
- 二级视图是一个 RecyclerView 包含很多 Movie。
FirstAdapter 中的关键代码:
// click show only 6, click again show all
public void showOrCollapse() {
if (showAll && secondModel2Show.size() >= 6) {
this.secondModel2Show = this.secondModel2Show.subList(0, 6);
} else {
this.secondModel2Show = this.secondModels;
}
this.notifyDataSetChanged();
showAll = !showAll;
}
SecondAdapter 中的 ket 代码
// bind data to view
@Override
public void onBindViewHolder(FirstHolder holder, int position) {
FirstModel firstModel = firstModels.get(position);
holder.cat.setText(firstModel.getCat());
final SecondAdapter secondAdapter = new SecondAdapter(firstModel.getSecondModels());
holder.rcv.setLayoutManager(new FullyGridLayoutManager(activity, 3));
holder.rcv.setAdapter(secondAdapter);
holder.cat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
secondAdapter.showOrCollapse();
}
});
}
第一个模型
public class FirstModel {
private String cat;
private List<SecondModel> secondModels;
}
第二个模型
public class SecondModel {
private int res;
}