RecyclerView将 layout 抽象成了一个 LayoutManager,RecyclerView 不负责它的 View 的布局,我们可以自定义 LayoutManager 来实现不同的布局效果,目前只提供了LinearLayoutManager。 LinearLayoutManager 可以指定方向,默认是垂直, 可以指定水平, 这样就轻松实现了水平的 ListView。
结论,在Activity中,需要自己定义一个LayoutManager:
rv = (RecyclerView)findViewById(R.id.rv);
LinearLayoutManager layoutManager = new LinearLayoutManager(context);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
rv.setLayoutManager(layoutManager);
如果在碎片中,也需要自己定义LayoutManager,但和Activity不太一样,需要有getActivity()来使用 “在Activity才能用到的方法”:
floor1RecyView = (RecyclerView) view.findViewById(R.id.floor1_recycler);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
//横向的 linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
floor1RecyView.setLayoutManager(linearLayoutManager);
还有一种情况,就是当你在适配器的onBindViewHolder中调用到notifyDataSetChanged()方法时,会偶现isComputingLayout刷新崩溃,原因是不能处于bindView的时候刷新数据,官方给出的方法时延时执行notifyDataSetChanged()数据刷新,我这里是这样处理的:
if (mRecyclerView.isComputingLayout()){
mRecyclerView.postDelayed(() -> {
mAdapter.notifyDataSetChanged();
},100);//延时100毫秒
}else {
mAdapter.notifyDataSetChanged();
}
其中的mRecyclerView是recyclerView对象。