我正在开发一个显示游戏列表的应用程序,在每个游戏的itemView中,我还有一个要显示的视频列表。预览和结构如下。
我将RecyclerView部署为窗口根视图,然后对于视频,我使用网格式的RecyclerView进行显示,所以这里我们得到了一个嵌套的RecyclerView结构。
但是有麻烦,因为游戏之间的视频数量不一致,我不希望视频列表的RecyclerView能够滚动,所以最好的方法是使View的高度拉伸动态取决于它有多少行。我听到一个令人失望的结论说,没有办法从互联网上实现这一目标。真的吗?任何替代方案都可以这样做吗?
到目前为止,关于这个问题,我不知道要解决它,所以我手动更改RecyclerView的高度作为临时解决方案。
videoGridRecyclerView.getLayoutParams().height = rowCount * 242;
鉴于视频项目的结构完全相同,如果这些RecyclerViews能够在屏幕上滑动后重新使用该视频的itemViews,那将会更好。性能提升得更好。
然后我尝试将特定的RecycledViewPool传播到每个嵌套的RecyclerViews。
public class MainActivity extends Activity {
private RecyclerView.RecycledViewPool mViewPool;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// create the RecycledViewPool from first and re-use for each nested RecyclerViews.
mViewPool = new RecyclerView.RecycledViewPool();
...
}
}
即使我完成了这项工作,我仍然会注意到正在执行onCreateViewHolder方法并且我在循环刷根RootlerView期间增加了膨胀计数器。
private static class VideoAdapter extends RecyclerView.Adapter<GridViewHolder> {
private List<Video> mVideoList;
private VideoAdapter(List<Video> videoList) {
mVideoList = videoList;
}
// this method would always invoke during i swipe the RecyclerView.
@Override
public GridViewHolder onCreateViewHolder(ViewGroup container, int viewType) {
Log.e("", String.format("createViewCount : %d", ++MainActivity.STAT_GAME_VIDEO_ITEM_COUNT));
return new GridViewHolder(inflate(container, R.layout.game_video_item)) {};
}
}
我的这个想法会起作用吗?或者我做错了?我希望实现这种效果,任何其他建议,即使不是关于RecyclerView也会很感激,提前感谢。
答案 0 :(得分:3)
到目前为止,我使用了GridLayout而不是嵌套的RecyclerView,并在我自己的GridLayout内部回收了视图。但这可能不是一个好方法,因为我的回收逻辑非常简单。快速滚动时应用程序仍然有点卡顿,我还没弄清楚。作为一个可行的结局,我将代码推送到github。如果您有任何想法,请告诉我,谢谢。
答案 1 :(得分:2)
是的,你在做什么是正确的。
只需创建一个RecyclerViewPool(就像您所做的那样)并通过setRecycledViewPool将其提供给所有RecyclerView实例。这样,他们将共享相同的视图池。
您可能更愿意增加其缓存大小,以避免在项目之间的视图数量差异很大时搅动视图。
顺便说一下,作为一个侧面建议,尝试将其合并到一个RecyclerView而不是嵌套的RecyclerViews。这样,动画等可以运行得更好。此外,当您在RV中使用RV时,向同一方向滚动会有问题,您可以通过将它们合并为一个来避免这个问题。