前言
记录一下之前写的一个多列布局,经常用于筛选条件中,比如这样:
这是一个4列数据和1列数据交错下的多列布局。之前我们写的时候用ScrollView包裹两个TextView作为Title,又包裹两个GridView作为4列数据,同时还要处理ScrollView和GridView的冲突(虽然很简单)。
现在可以直接使用RecyclerView一个布局来实现。接下来先介绍如何实现,再对比和之前实现方式优劣,即实用性。
使用RecyclerView实现
主要依靠GridLayoutMananger
和它的一个方法setSpanSizeLookup
来实现。
/* 传入所有列数的最小公倍数,1和4的最小公倍数为4,即意味着每一列将被分为4格 */
GridLayoutManager gridLayoutManager = new GridLayoutManager(this.getContext(), 4);
//设置表格,根据position计算在该position处1列占几格数据
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override public int getSpanSize(int position) {
//计算在哪个position时要显示1列数据,即columnCount / 1列 = 4格,即1列数据占满4格
if (position == 0 || position == mTopGridData.size() + 1) {
return 4;
}
//return 2即为columnCount / 2 = 2列,一格数据占2列,该行显示2列
//1格1列,即改行有columnCount / 1 = 4列,该行显示4列
return 1;
}
});
recyclerView.setLayoutManager(gridLayoutManager);
recyclerView.setAdapter(new DoubleGridAdapter(getContext(), mTopGridData, mBottomGridList, this));//设置数据
这就是使用RecyclerView实现多列布局的方式,接下来说说两种方式的优劣。
两种方式优劣
使用RecyclerView
好处是仅用一个布局,减少了布局层次嵌套,有时候甚至可以把 完成 按钮也当做一列数据。
但是这种方式乍一看很简单,其复杂性体现在对数据的处理上和UI变化上。筛选器中必须要把当前选中的Holder回调出来,保存其数据并更新其UI。尤其在有全部选项时或者多选时。当列越多思路必须要越清晰。
这种实现也会随着需求越变越复杂而增加维护难度。使用ScrollView和GridView嵌套
缺点是构建表格时比较繁琐(不停的累加GridView)和设置Adapter时代码较多。
但有点很多。
1.因为拆开写所以很清晰,大多数逻辑相同仅数据不一样,不会出大错。
2.可以直接使用AbsListView的setChoiceMode
方法,使用CheckedTextView
时会自动更新UI,而且可以通过getCheckedItemPosition
直接获取点选数据,更为方便。
这两种实现都写在DropDownMenu中的doubleGrid,你可以看到这两种实现的区别。
结语:
当列比较简单时,使用RecyclerView实现比较轻便;但比较复杂的表格时RecyclerView对比较难以数据,但不妨一试。自己在实际项目开发中有一个3、4列数据的,同时还有全部选项、并可以多选,还要有反选功能(点击该表格的全部后其他数据置灰),写的欲罢不能。所以在这总结一下,不过回过头来看,还是觉得使用RecyclerView实现要好一点,很有趣,还不错,可以试试。